html tool

显示标签为“awk&sed”的博文。显示所有博文
显示标签为“awk&sed”的博文。显示所有博文

2024年6月24日星期一

awk 用0补位

 参考:https://www.cnblogs.com/rananie/p/15626439.html

printf '%05d\n' 3

2021年12月14日星期二

转:awk转置文本内容

 参考:https://www.leaflag.cn/2019/03/17/%E8%BD%AC%E7%BD%AE%E6%96%87%E4%BB%B6/#%E5%89%8D%E7%BD%AE%E7%9F%A5%E8%AF%86


前置知识

awk是啥?awk是一种优良的文本处理工具,它不仅是Linux中也是任何环境中现有的功能最强大的数据处理引擎之一。先来了解一下解决这个问题需要用到的awk里的指令:

  1. NF:这个表示的是字段总数;
  2. NR:这个表示的是所读文件的当前行数;
  3. $0:表示当前行的所有内容,比如print $0可以打印整行内容;
  4. $i:表示第i个字段;
  5. BEGIN,END:这两个个标识程序开始和结束。

开始写!

awk的shell格式是awk ‘{XXXX}’ filename,
所以我们可以使用这样的命令:

复制成功
awk '{
for(i=1;i<=NF;i++){
if(NR==1){
file[i]=$i #这里如果打印file[i],会发现是两行,第一行是name,第二行是age。和其它语言的数组打印格式不同
}else{
file[i]=file[i] " " $i #因为输出要求有空格
}
}
}
END{
for(i=1;i<=NF;i++){
print file[i]
}
}' file.txt

这里为了好看一些,排了个版,当然我们需要在终端直接输入一整行指令,存成文件也可以,不过估计得改一下文件路径:

awk '{for(i=1;i<=NF;i++){if(NR==1){file[i]=$i}else{file[i]=file[i]" "$i}}}END{for(i=1;i<=NF;i++) print file[i]}' file.txt

为什么这样写?

现在来解释一下。我们知道file.txt有三行,每行两个字段,所以NF=2;
如果文件只有一行,即NR=1的话,直接构造一个数组把字段存进去即可得到转置后的文件(注释里有,自己也可以试着打印一下)。得到NR=1是的file数组输出:

name
age

接着开始读取下一行,又重新开始循环,i=1,此时NR=2,所以执行else里面的代码,此时会在原有file数组里增加file.txt第二行的字段(file[i]=file[i] “ “ $i),第一次循环:

name alice
age 21

至此,第二次循环后执行END结束里的指令,得到我们想要的输出。
值得注意的是每次读完一行,都会这一行的开始读取字段,重新循环是一个点

将mpstat中的pm转换为24小时进制

 问题:将mpstat中的pm转换为24小时进制

解决:

cat t  |grep all|awk -F " *|:" '{if ($5~"PM")t=$2+12;else t=$2; print $1" "t":"$3":"$4","(100-$16)/100} '
  
t中的内容如下:

# head -n20 t
2021-12-13 03:08:28 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
2021-12-13 03:08:30 PM  all    0.19    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   99.31
2021-12-13 03:08:30 PM    0    0.50    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.50
2021-12-13 03:08:30 PM    1    0.50    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   99.00

2021年12月13日星期一

转:awk 运算

 参考:https://www.twle.cn/c/yufei/awk/awk-basic-arithmetic-operators.html

$ awk 'BEGIN { x = 15; y = 25; print "(x + y) = ", (x + y) }'

2021年9月9日星期四

转: awk 判断数值

 参考:https://segmentfault.com/a/1190000037490650

如果文件大小为0,打印此文件

# ls -all  winxpsp3_exe_sha256_dir/|awk '$5==0{print $0}'

-rw-r--r-- 1 root root      0 9月  10 14:34 e9540bb5e759caea6dfbe110fcce32864a0b5a7600499702a52c8501388d2d99


2021年4月15日星期四

awk : substr

 

https://blog.csdn.net/xrt95050/article/details/6833286


awk 里的substr函数用法举例:

要截取要截取的内容1:

F115!16201!1174113017250745 10.86.96.41 211.140.16.1 200703180718
F125!16202!1174113327151715 10.86.96.42 211.140.16.2 200703180728
F235!16203!1174113737250745 10.86.96.43 211.140.16.3 200703180738
F245!16204!1174113847250745 10.86.96.44 211.140.16.4 200703180748
F355!16205!1174115827252725 10.86.96.45 211.140.16.5 200703180758

使用 awk 内置的取子串函数提取输入文件中的手机号
$ awk -F '[ !]' '{print substr($3,6,11)}' test.txt
13017250745
13327151715
13737250745
13847250745
15827252725

解释:
substr($4,20)
     --->  表示是从第4个字段里的第20个字符开始,一直到设定的分隔符","结束.

substr($3,12,8)  --->  表示是从第3个字段里的第12个字符开始,截取8个字符结束.

substr($3,6)     --->  表示是从第3个字段里的第6个字符开始,一直到设定的分隔.

2017年12月13日星期三

shell 计算浮点数

http://www.361way.com/linux-bc-point-zero/4960.html



打开bc进入交互模式,我们键入scale=2; 1/3 回车,看到结果0.33前的0没有---注意此处保留小数点人2位 scale=2不能少,少了结果为是0 。
解决方法如下:
  1. #!/bin/bash
  2. #方法1
  3. res1=$(printf "%.2f" `echo "scale=2;1/3"|bc`)
  4. res2=$(printf "%.2f" `echo "scale=2;5/3"|bc`)
  5. #方法2 【popexizhi: 看来还是用awk 比bc 好一点 :)】
  6. #v=$(echo $big $small | awk '{ printf "%0.2f\n" ,$1/$2}')
  7. v1=$(echo 1 3 | awk '{ printf "%0.2f\n" ,$1/$2}')
  8. v2=$(echo 5 3 | awk '{ printf "%0.2f\n" ,$1/$2}')
  9. #方法3
  10. mem1=`echo "scale=2; a=1/3; if (length(a)==scale(a)) print 0;print a "|bc`
  11. mem2=`echo "scale=2; a=5/3; if (length(a)==scale(a)) print 0;print a "|bc`
  12. echo res1 is $res1
  13. echo res2 is $res2
  14. echo v1 is $v1
  15. echo v2 is $v2
  16. echo mem1 is $mem1
  17. echo mem2 is $mem2

2017年8月7日星期一

sed shell 参数

$x="xx"
$cat logConfig.cfg |sed  "s/#/$x/g"
#使用双引号即可,单引号不支持传递变量

2017年2月23日星期四

命令行显示内容去掉换行符

参考:http://blog.csdn.net/hello_hwc/article/details/40118129

一个比较有趣的例子
如何替换\n也就是把所有的行都归为一行

第一种方式
[plain] view plain copy
  1. [root@localhost ~]# sed ':a;N;$!ba;s/\n/ /g' file.txt   
  2. wtmp begins Mon Feb 25 14:26:08 2014 192.168.0.1 162.12.0.123 this is the last line  
[popexizhi:
a - 追加
N - Next N 读取下一行的内容并且将这些内容附加到 pattern space 当前的内容后面 (http://blog.khotyn.com/blog/2013/07/30/sed-part-two/
$! - 只有最后一行不执行后面的命令,其他的都执行(这里可以指定行数例如2,3但要求存在此行否则整个命令就执行失败了)
':a;N;3!ba;s/\n/ /g' 就是指对1,3执行这个替换
(http://coolshell.cn/articles/9104.html
第二个示例,反序了一个文件的行:
1
2
3
4
sed '1!G;h;$!d' t.txt
three
two
one
其中的 ‘1!G;h;$!d’ 可拆解为三个命令
  • 1!G —— 只有第一行不执行G命令,将hold space中的内容append回到pattern space
  • h —— 第一行都执行h命令,将pattern space中的内容拷贝到hold space中
  • $!d —— 除了最后一行不执行d命令,其它行都执行d命令,删除当前行
)
: ---   : label  建立 script file 内指令互相参考的位置
b - b label  将执行的指令跳至由 : 建立的参考位置
http://blog.csdn.net/zg_hover/article/details/1804481

这样 ':a;N;$!ba;s/\n/ /g' 可以解释为:
增加标签a,把下一行读入缓冲区,一直读到最后一行-1,跳转到标签a的位置执行s/\n/ /g
所以这里的a可以起任何名字不影响,例如':d;N;$!bd;s/\n/ /g'

hexu共享了另一个sed 脚本也很不错,共享一下

1 {
    h
}

2,${
    H
}

${
    x
    s/\n/|/g
}

]


第二种方式
[plain] view plain copy
  1. [root@localhost ~]# tr "\n" " " < file.txt   
  2. wtmp begins Mon Feb 25 14:26:08 2014 192.168.0.1 162.12.0.123 this is the last line last linen  


2016年11月21日星期一

linux批量重命名文件

add:http://www.cnblogs.com/longdouhzt/archive/2012/04/30/2477282.html

--------------------------------------------------------
修改后面5个字母为snail

[root@pps mailqueue]# for i in `ls`; do mv -f $i `echo $i | sed 's/.....$/snail/'`; done

[popexizhi]这个功能太帅了,性能测试的log处理和复用使用起来太棒了。

2016年11月2日星期三

将指定目录中的文件每行结尾添加此文件名称

将指定目录中的文件每行结尾添加此文件名称: 
 1 ls -1 testdata| xargs -i sed -i "s/$/ {}/g" testdata/{}

2016年10月13日星期四

linux shell awk获得外部变量(变量传值)简介


add:http://www.cnblogs.com/chengmo/archive/2010/10/03/1841753.html
BEGIN程序块中变量
[chengmo@localhost ~]$ test='awk code'                                
[chengmo@localhost ~]$ echo | awk -v test="$test" 'BEGIN{print test}'
awk code
[chengmo@localhost ~]$ echo | awk -v test="$test" '{print test}'    
awk code

格式如:awk –v 变量名=变量值 [–v 变量2=值2 …] 'BEGIN{action}’  注意:用-v 传入变量可以在3中类型的action 中都可以获得到,但顺序在  action前面。
  
3.获得环境变量
[chengmo@localhost ~]$ awk  'BEGIN{for (i in ENVIRON) {print i"="ENVIRON[i];}}'
AWKPATH=.:/usr/share/awk
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
SELINUX_LEVEL_REQUESTED=
SELINUX_ROLE_REQUESTED=
LANG=en_US.UTF-8

2014年7月24日星期四

awk 与 sed 之 awk1 学习笔记

add:http://kodango.com/tag/sed-and-awk/  转自: 团子的小窝 , 本文固定链接: Sed and awk 笔记之 awk 篇:快速了解 Awk(一)

使用Awk,我们可以做以下事情:
将文本文件视为由字段和记录组成的文本数据库; [popexizhi:此喻甚佳,awk之用为文本字符之sql :),下列为此喻之上,系统性很强,赞一个]
在操作文本数据库的过程中能够使用变量;
能够使用数学运算和字符串操作
能够使用常见的编程结构,例如条件分支与循环;
能够格式化输出;
能够自定义函数;
能够在awk脚本中执行UNIX命令;
能够处理UNIX命令的输出结果;


basic
-F
通过-F参数设置冒号:为分隔符,并打印各个字段     
$ echo "1:2:3" | awk -F: '{print $1 " and " $2 " and " $3}'
1 and 2 and 3
-v
-v 设置变量
$ echo | awk -v a=1 'BEGIN {print a}'
1
PS:-v选项的赋值操作在BEGIN动作之前就执行
$ echo 1 | awk -v var=a 'BEGIN {print "BEGIN: " var}'
BEGIN: a

BEGIN/END
BEGIN是一个特殊的pattern,它在awk处理输入之前就会执行,可以认为是一个初始化语句,与此对应的还有END

变量定义与文件的位置
文件名
-
awk可以同时指定多个输入文件,如果输入文件的文件名为'-',表示从标准输入读取内容
顺序
文件内容
>cat a
file a
>cat b
file b

变量定义在filename前
$ awk 'BEGIN {print "BEGIN: " var} {print "PROCESS: " var} END {print "END: " var }' var=1 a
BEGIN:
PROCESS: 1
END: 1
变量定义在filename后
$ awk 'BEGIN {print "BEGIN: " var} {print "PROCESS: " var} END {print "END: " var }' a var=1 
BEGIN:
PROCESS:
END: 1
赋值操作发生在正常处理之后,END动作之前。
变量赋值一定要小心不要与保留关键字重名,否则会报错,可以查看awk的man手册查询哪些是保留关键字
变量定义在filename之间
$ awk 'BEGIN {print "BEGIN: " var} {print "PROCESS: " var} END {print "END: " var }' a var=1 b
BEGIN:
PROCESS:
PROCESS: 1
END: 1
赋值操作发生在处理前面的文件之后,并且位于处理后面的文件之前


总结
总结如下:
如果变量赋值在第一个文件参数之前,在BEGIN动作之后执行,影响到正常处理和END动作;
如果变量赋值在最后一个文件参数之后,在END动作之前执行,仅影响END动作;
如果文件参数不存在,情况同1所述;
如果变量赋值位于多个文件参数之间,在变量赋值前面的文件被处理后执行,影响到后续文件的处理和END动作;