AWK
# begin 行处理前
awk 'BEGIN {FS=":" ; OFS="+++++++++++"} {print $1,$3}' /etc/passwd
# 处理前,处理中,处理后
BEGIN{处理前} {行处理} END{处理后}
awk 'BEGIN {print 1/2} {print 'ok'} END {print 'over'}' /etc/passwd
print 'ok' 为行处理,passwd 有两行则打印两个
# 匹配内容
awk '/root/' /etc/passwd
# 处理动作
awk '{action}' filename
awk -F: '{print $1}' /etc/passwd
# 匹配+处理动作
awk -F ":" '/root/ {print $1,$2}' /etc/passwd
# 判断大于多少则输出
df|awk '/$/ {if ($3>500000) print $4}'
awk 工作原理
# awk -F ":" '{print $1,$3}' /etc/passwd
1. 载入文件中的第一行,然后将这一行放入模式空间,并将彼此赋值给¥0
2. 通过字段分隔符,切割整行的内容,并将切割后的字段按$0,$1,$2
3. 检查print函数需要打印的字段,然后从模式空间中取出字段对应的值
4. 默认结果以空格为分隔,也可修改OFS内部变量调整
5. 将结果输出到终端,awk开始循环1-5步骤
-F 由FS内部变量决定整行内容如何存储在模式空间
也可以使用航处理前的操作 BEGIN{FS=":"}
1. 同时指定多个分隔符
awk -F "[: ]" '{print $2}' file.txt
awk -F "[: ]+" '{print $2}' file.txt
2. 内置变量
# NF 统计一行一共有多少列
$NF 保存最后一列的值(永远代表最后一行)
$(NF-1) 倒数第二行
# NR表示行号
awk '{print NR,$0}' file.txt
awk 'NR!=3 {print $0}' file.txt
grep -n "." file.txt # 显示行号
# FNR, 处理多个文件用到的
awk '{print FNR,$0}' A.TXT B.TXT
行号12345 12345
打印第二行到第三行
awk 'NR>1&&NR<4 {print $0}' a.txt
# FS指定字段分隔符,默认空格
awk -F: '/root/{print $1,$3}' /etc/passwd
awk 'BEGIN{FS=":"} {print $1,$3}' /etc/passwd
awk -F '[ : ]' '{print $1,$2}' /etc/passwd
# OFS 指定输出字段分隔符
,逗号映射为OFS. 初始情况下OFS变量是空格
awk -F: '/root/{print $1,$2}' /etc/passwd
awk -F: 'BEGIN{OFS="-------"} /root/{print $1,$2}' /etc/passwd