“ 鬼知道我为何记得这些命令。——编程三分钟”linux
awk
同sed
命令相似,只不过sed
擅长取行,awk
命令擅长取列。(根据了解awk
是一种语言,不过咱们只关注他处理文本的功能,用的好的话几乎能够取代excel)
原理:通常是遍历一个文件中的每一行,而后分别对文件的每一行进行处理
用法:c++
awk [可选的命令行选项] 'BEGIN{命令 } pattern{ 命令 } END{ 命令 }' 文件名
复制代码
$ echo 'I love you' | awk '{print $3 $2 $1}'
youloveI
复制代码
咱们将字符串 I love you
经过管道传递给awk命令,至关于awk处理一个文件,该文件的内容就是I love you
,默认经过空格做为分隔符(无论列之间有多少个空格都将看成一个空格处理)I love you
就分割成三列了。
假如分割符号为.
,能够这样用shell
$ echo '192.168.1.1' | awk -F "." '{print $2}'
168
复制代码
咱们知道awk的用法是这样的,那么pattern部分怎么用呢?编程
awk [可选的命令行选项] 'BEGIN{命令 } pattern{ 命令 } END{ 命令 }' 文件名
$ cat score.txt
tom 60 60 60
kitty 90 95 87
jack 72 84 99
$ awk '$2>=90{print $0}' score.txt
kitty 90 95 87
复制代码
$2>=90 表示若是当前行的第2列的值大于90则处理当前行,不然不处理。说白了pattern部分是用来从文件中筛选出须要处理的行进行处理的,这部分是空的表明所有处理。pattern部分能够是任何条件表达式的判断结果,例如>,<,==,>=,<=,!=
同时还可使用+,-,*,/
运算与条件表达式相结合的复合表达式,逻辑 &&,||,!
一样也可使用进来。另外pattern部分还可使用 /正则/ 选择须要处理的行。bash
判断语句是写在pattern{ 命令 }
命令中的,他具有条件过滤同样的做用,同时他也可让输出更丰富网络
$ awk '{if($2>=90 )print $0}' score.txt
kitty 90 95 87
$ awk '{if($2>=90 )print $1,"优秀"; else print $1,"良好"}' score.txt
tom 良好
kitty 优秀
jack 良好
复制代码
awk [可选的命令行选项] 'BEGIN{命令 } pattern{ 命令 } END{ 命令 }' 文件名
复制代码
使用方法以下:函数
$ awk 'BEGIN{print "姓名 语文 数学 英语"}{printf "%-8s%-5d%-5d%-5d\n",$1,$2,$3,$4}' score.txt
姓名 语文数学英语
tom 60 60 60
kitty 90 95 87
jack 72 84 99
复制代码
这里要注意,我为了输出格式好看,作了左对齐的操做(%-8s左对齐,宽8位),printf
用法和c++
相似。
不只能够用来定义表头,还能够作一些变量初始化的工做,例如ui
$ awk 'BEGIN{OFMT="%.2f";print 1.2567,12E-2}'
1.26 0.12
复制代码
这里OFMT是个内置变量,初始化数字输出格式,保留小数点后两位。spa
和BEGIN用法相似命令行
$ echo ok | awk '{print $1}END{print "end"}'
ok
end
复制代码
这个地方我要放大招了!上面的知识点你都记住了吗?
$ awk 'BEGIN{print "姓名 语文 数学 英语 总成绩"; \ sum1=0;sum2=0;sum3=0;sumall=0} \ {printf "%5s%5d%5d%5d%5d\n",$1,$2,$3,$4,$2+$3+$4;\ sum1+=$2;sum2+=$3;sum3+=$4;sumall+=$2+$3+$4}\ END{printf "%5s%5d%5d%5d%5d\n","总成绩",sum1,sum2,sum3,sumall}'\
score.txt
姓名 语文 数学 英语 总成绩
tom 60 60 60 180
kitty 90 95 87 272
jack 72 84 99 255
总成绩 222 239 246 707
复制代码
由于命令太长,末尾我用\
符号换行了。。
column -t
(鬼知道我为何会记得这么多乱七八糟的命令。)NF:表示当前行有多少个字段,所以$NF
就表明最后一个字段
NR:表示当前处理的是第几行
FILENAME:当前文件名
OFMT:数字输出的格式,默认为%.6g。表示只打印小数点后6 位
$ awk -F ':' '{print NR ") " $1}' demo.txt
1) root
2) daemon
3) bin
4) sys
5) sync
复制代码
awk定义了不少内置函数,用awk来写shell脚本却是一个不错的选择,可是大多数咱们是用不上的,如下是经常使用函数
$ echo 1 2 | awk '{print $1+sqrt($2)}'
2.41421
复制代码
随机数,先设置种子再随机
rand() 0 <= n < 1,srand([expr]) |将 rand 函数的种子值设置为 Expr 参数的值,或若是省略 Expr 参数则使用某天的时间。
$ echo 1 | awk 'BEGIN{srand()}{print rand()}'
0.929885
复制代码
字符串
系统经常使用
不经常使用算数:
推荐阅读
(点击标题可跳转阅读)
若是有帮助别忘了分享给朋友哦~