1.工作原理
逐行读取文本,默认以空格或者tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量(内部变量)中,并按模式或者条件执行编辑命令。
sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个“字段”然后再进行处理。awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数根据打印显示。
2.命令格式
awk 选项 '模式或条件 {操作}' 文件1 文件2 ...
awk -f 脚本文件 文件1 文件2 ...
3.常见的内建变量(可直接用)
FS:列分割符。指定每行文本的字段分割符,默认为空格或制表位。与“-F”作用相同
NF:点前处理的行的字段个数
NR:当前处理的行的行号(序数)
$0:当前处理的行的整行内容
$n:当前处理行的第n个字段(第n列)
FILENAME:被处理的文件名
RS:行分割符。awk从文件上读取资料时,将根据RS的定义把资料切割成许多条记录,而awk一次仅读入一条记录,以进行处理。预设值是'\n'
4.按行输出内容
1.$0表示当前行的整行内容
(1)awk ‘{print $0}’ 123.txt #输出所有内容
(2.)awk ‘{print}’ 123.txt #输出所有内容
2.使用NR指定行号
awk ‘NR==1,NR==3{print}’ 123.txt #输出第1~3行内容
awk ‘(NR>=1)&&(NR<=3){print}’ 123.txt #输出第1~3行内容
awk ‘NR==1||NR==3{print}’ 123.txt #输出第1行、第3行内容
awk ‘(NR%2)==1{print}’ 123.txt #输出所有奇数行的内容awk ‘(NR%2)==0{print}’ 123.txt #输出所有偶数行的内容
3.通过文本模式(匹配字符串)过滤出行
awk ‘/^root/{print}’ /etc/passwd #输出以root开头的行
awk ‘/nologin$/{print}’ /etc/passwd 输出以 nologin 结尾的行4.$n表示当前处理行的第n个字段
获取ip地址
5.BEGIN模式
格式:
awk 'BEGIN{...};{...};END{...}' 文件
#处理过程: 1、在awk处理指定的文本之前,需要先执行BEGIN{...}模式里的命令操作; 2、中间的{...} 是真正用于处理文件的命令操作; 3、在awk处理完文件后才会执行END{...}模式里的命令操作。END{ }语句块中,往往会放入打印结果等语句。
grep -c 也可以统计匹配行的行数
6.按字段(列)输出内容
1.使用-F指定分隔符
2.将内建变量FS重新赋值
内建变量FS表示列分隔符,默认为空格或制表位。重新赋值可重新指定分隔符。
3.打印uid大于500的用户或者打印uid小于等于500的用户
!表示取反,不大于500,即小于等于500
(1)大于500的用户
(2)小于等于500的用户
4.使用if语句
使用if语句时,内部条件要加(),外面要加()。将{ }整条语句当作一个操作命令,相当于嵌套。
7. 三元运算符
java和shell中的三元运算符
java中: (条件表达式)?(A表达式或者值):(B表达式或者值)
条件表达式成立(为真)时,会取冒号前面的值A。
条件表达式不成立(为假)时,会取冒号后面的值B。
Shell中: [ 条件表达式 ] && A || B
条件表达式成立(为真)时,会取||前面的值A。
条件表达式不成立(为假)时,会取||后面的值B。
8.$NF,$n~,$n!,$n==,$n!=
$NF //代表最后一个字段
~ 表示包含,!~ 表示不包含,== 表示等于,!= 表示不等于
$n> < == //用于对比数值
$n~"字符串" //代表第n个字段 包含 某个字符串的作用
$n!~"字符串" //代表第n个字段 不包含 某个字符串的作用
$n=="字符串" //代表第n个字段 为 某个字符串的作用
$n!="字符串" //代表第n个字段 不为 某个字符串的作用