9.6/9.7 awk
awk
awk是一种很棒的语言,它适合文本处理和报表生成,其语法较为常见,借鉴了某些语言的一些精华,如C语言等。awk在linux系统日常处理工作中,发挥很重要的作用,掌握了awk将会使你的工作变的高大上。
awk语法比sed多,有变量、数组和语句控制,所以功能更加强大。不过初学awk建议先学一些常用的用途,后期再深入。最一开始不深入语法的话,awk比sed主要多了分段功能。
awk命令行格式为:awk [选项] ‘{command}’ 输入文本。-F选项指定分段符,如果不知定的话,默认为空格。在awk中,花括号用于将几块代码组合到一起,这一点类似C语言。以awk '{print $0}' /etc/passwd为例,这里指定/etc/passwd为输入文件。执行awk时,它依次对/etc/passwd中的每一行执行 print命令。所有输出都发送到stdout,所得到的结果与执行cat /etc/passwd 完全相同。awk和grep、sed一样,是流处理模式,逐行处理文本,$0代表当前处理的行。
正则表达式
下面结合正则表达式,列出一些常用的awk命令。学习初期掌握这些基本够用,要多练习相关功能。先创建一个test.txt试验:cp /etc/passwd test.txt。
head -n2 test.txt|awk -F ':' '{print $1}' #以冒号为分隔符,打印第一段
head -n2 test.txt|awk -F ':' '{print $0}' #以冒号为分隔符,打印整行
awk -F ':' '{print $1"#"$2"#"$3"#"$4}' #以冒号为分隔符,打印第1、2、3、4段,中间以井号间隔
awk '/oo/' test.txt #打印包含oo的行
awk -F ':' '$1 ~/oo/' test.txt #以冒号为分隔符,打印第一列包含oo的行
awk -F ':' '/root/ {print $1,$3} /games/ {print $1,$3}' test.txt #以冒号为分隔符,打印包含root行的第一、三段,打印包含games行的第一、三段
awk -F ':' '$3=="0"' /etc/passwd #以冒号为分隔符,打印第三段是文本0的行,双引号代表字符,没有双引号代表数字
awk -F ':' '$3>="500"' /etc/passwd #以冒号为分隔符,打印第三段大于等于字符串500的行
awk -F ':' '$3>=500' /etc/passwd #以冒号为分隔符,打印第三段大于等于数字500的行
awk -F ':' '$7!="/sbin/nologin"' /etc/passwd #以冒号为分隔符,打印第七段不为/sbin/nologin的行
awk -F ':' '$3
awk -F ':' '$3>"5" && $3
awk -F ':' '$3>1000 || $7=="/bin/bash"' /etc/passwd #以冒号为分隔符,打印第三段大于1000或者第七段等于/bin/bash的行
head -5 /etc/passwd |awk -F ':' '{OFS="#"} {print $1,$3,$4}‘ #以冒号为分隔符,打印每行第1、3、4段,并以井号间隔
awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}}' /etc/passwd #以冒号为分隔符,如果第三段大于1000则打印第1、3、4段,并以井号间隔
head -n3 /etc/passwd | awk -F ':' '{print NF}‘ #以冒号为分隔符,逐行打印该行列数
head -n3 /etc/passwd | awk -F ':' '{print NR}‘ #以冒号为分隔符,逐行打印该行行数
awk 'NR>40' /etc/passwd #打印行数大于40的行
awk -F ':' 'NR<20 && $1 ~ /roo/' /etc/passwd #打印行数小于20并且第一段包含roo的行
head -n 3 /etc/passwd |awk -F ':' '$1="root"‘ #以冒号为分隔符,给第一段赋值root,然后打印每一行
awk -F ':' '{(tot=tot+$3)}; END {print tot}' /etc/passwd #逐行做完tot=tot+3的运算,最后打印出tot的值
awk -F ':' '{if ($1=="root") {print $0}}' /etc/passwd #如果第一段是root,打印该行