shell学习之awk(七)

322 阅读2分钟
  • AWK是一种处理文本文件的语言,是一个强大的文本分析工具,主要进行列操作。

  • sed以行为单位处理文件,awk比sed强的地方在于不仅能以行为单位还能以列为单位处理文件。

# 语法格式
awk option 'script' file1 file2 ...
awk option -f scriptfile file1 file2 ...
  • 和sed一样,awk处理的文件既可以由标准输入重定向得到,也可以当命令行参数传入,编辑命令可以直接当命令行参数传入,也可以用-f参数指定一个脚本文件,编辑命令的格式为:
/pattern/{actions}
condition{actions} # 满足什么条件 执行什么动作

和sed类似,pattern是正则表达式,actions是一系列操作。awk程序一行一行读出待处理文件,如果某一行与pattern匹配,或者满足condition条件,则执行相应的actions,如果一条awk命令只有actions部分,则actions作用于待处理文件的每一行。

实战例子:

# testfile的内容表示某商店的库存量:
ProductA  30
ProductB  76
ProductC  55

# 打印指定列的内容
# 自动变量$1$2分别表示第一列、第二列等,类似于Shell脚本的位置参数,而$0表示整个当前行。
$ awk '{print $2;}' testfile  
30
76
55

# 如果某种产品的库存量低于75则在行末标注需要订货:
$ awk '$2<75 {printf "%s\t%s\n", $0, "REORDER";} $2>=75 {print $0;}' testfile
ProductA  30    REORDER
ProductB  76
ProductC  55    REORDER

# awk命令可以像C语言一样使用变量(但不需要定义变量),比如统计一个文件中的空行数 /^ *$/ 空行正则
$ awk '/^ *$/ {x=x+1;} END {print x;}' testfile
# END 可写可不写,写表示 END前执行完毕后,再执行END后的语句

awk常用的内建变量

FILENAME  当前输入文件的文件名,该变量是只读的
NR  当前行的行号,该变量是只读的,R代表record
NF  当前行所拥有的列数,该变量是只读的,F代表field
OFS 输出格式的列分隔符,缺省是空格
FS  输入文件的列分融符,缺省是连续的空格和Tab
ORS 输出格式的行分隔符,缺省是换行符
RS  输入文件的行分隔符,缺省是换行符

例如打印系统中的用户帐号列表

文件内容:
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin


# BEGIN表示先执行{FS=":"}
$ awk 'BEGIN {FS=":"} {printf "%s\t%s\n" $1, $7;}' /etc/passwd
root	
bin	
daemon	
adm	

# 打印第一行和第七行\t tab空格 \n换行 %s 占位符
$ awk 'BEGIN {FS=":"} {printf "%s\t%s\n", $1,$7}' /etc/passwd

文章规划

好了各位,以上就是这篇文章的全部内容了,能看到这里人啊,都是人才。

如果这个文章写得还不错,觉得「王采臣」我有点东西的话 求点赞👍求关注❤️求分享👥 对耿男我来说真的非常有用!!!

白嫖不好,创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!

王采臣 | 文  【原创】

如果本篇博客有任何错误,请批评指教,不胜感激 !

微信公众号: