shell - AWK

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 '[ :\t]' '{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

猜你喜欢

转载自www.cnblogs.com/Afrafre/p/11405738.html