Shell正则表达式 awk命令

1
2
3
4
5
6
7
8
9
awk '条件1{动作1}条件2{动作2}...' 文件名
条件
-一般使用关系表达式作为条件
-x>10、x>=10、x<=10
动作
-格式化输出
-流程控制

一个条件满足,就执行条件后面{}内的动作。
没有条件就无条件执行{}内的动作,如果有条件,就只有满足条件才能执行{}内的动作。

awk的流程:依次读取每一行数据,读取完一行数据后,进行条件判断,如果满足条件,就执行该条件对应的动作,其中文件名为$0,剩下的每一列依次为$1\$2…,判断完一行后,继续判断下一行,直到知道文件全部判断完

1
2
3
4
5
6
awk '{printf $2 "\t" $4"\n"}' student.txt
#注意printf里面输出格式的双引号,printf中的转义符号都要用""括起来。
#printf后面要接换行符"\n"
df -h| awk '{printf $1"\t" $5"\n"}'
#查看系统使用率

BAGIN条件

条件BAGIN表示在所有动作执行前先执行BEGIN后的那个动作

1
2
3
df -h | awk 'BEGIN{print "test"}{print $1 "\t" $3}'
会在最前面输出test
awk在指定分隔符前面一定要加BEGIN

END条件

条件END表示在所有动作执行后才执行END后的那个动作

1
2
#df -h | awk 'END{print "test"}{print $1 "\t" $3}'
会在最后面输出test

FS内置变量

修改分隔符(默认为空格和制表符)
在修改FS的变量的动作前要加上BEGIN,这样在执行所有其它动作之前先修改分割符,否则读取第一行数据的时候不能识别指定的分隔符

1
2
3
4
5
cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN{FS=":"}{print $1 "\t" #3}'
#awk在指定分隔符前面一定要加BEGIN,此例截取第1、3列
cat student.txt | grep -v Name | awk '$4>=70{print $2}'
#此例截取除了列头的成绩大于等于70分的学生姓名,grep -v Name为取反命令,不输出带“Name”的行