01.awk作用

**更多详细内容参考:**https://www.cnblogs.com/xiaonq/p/11969744.html

1.1 awk作用

  1. awk是一种编程语言,用于在linux下对文本和数据进行处理
  2. awk的处理文件和数据处理方式是逐行扫描,寻找到匹配的行,并在这些行上进行你想要的操作
  3. 如果没有指定处理动作,则把匹配的行显示到屏幕上

1.2 awk常用指令

//              # 匹配代码块,可以是字符串或正则表达式
{}              # 命令代码块,包含一条或多条命令
$0              # 表示整个当前行
$1              # 每行第一个字段
NF              # 字段数量变量
NR              # 每行的记录号,多文件记录递增
/[0-9][0-9]+/      # 两个或两个以上数字
/[0-9][0-9]*/      # 一个或一个以上数字
-F'[:#/]'         # 定义三个分隔符
FNR             # 与NR类似,不过多文件记录不递增,每个文件都从1开始
\t              # 制表符
\n              # 换行符
FS              # BEGIN时定义分隔符
RS              # 输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)
~               # 匹配,与==相比不是精确比较
!~              # 不匹配,不精确比较
==              # 等于,必须全部相等,精确比较
!=              # 不等于,精确比较
&&             # 逻辑与
||              # 逻辑或
+               # 匹配时表示1个或1个以上

02.awk使用

2.1 awk常用指令

cat /etc/passwd |awk -F ':' '{print $1}'             # 以冒号为分隔打印第一列数据
cat /etc/passwd | awk -F ':' '{print $1"\t"$7}'      # 打印第一列和第七列数据,并以制表符分隔
awk -F ':' '/root/{print $1}' /etc/passwd            # 搜索/etc/passwd有root关键字的所有行,只显示第一行
w|awk 'NR==1{print $6}'                              # 显示第一行第六列的数据
awk -F: 'NR==5 || NR==6{print}' /etc/passwd          # 打印第五行和第六行数据
awk '!/mysql/' /etc/passwd                           # 匹配所有 不包含 "mysql"关键字的行
awk '/mysql|mail/{print}' /etc/passwd                # 匹配包含mysql 或者 mail的行

2.2 awk基本语法

tail -n3 /etc/services |awk -F'[ /]+' '{print $2}'    # 以"空格"或"斜线"分隔
awk -v a=123 'BEGIN{print a}'                         # 变量赋值
tail -n3 /etc/services |awk 'BEGIN{print "服务\t\t端口\t\t\t描述"}{print $0}END{print "===结束==="}' 
# BEGIN{} END{}结合使用

2.3 正则匹配

tail /etc/services |awk '/^blp5/{print $0}'          # 匹配开头是 blp5 的行
tail /etc/services |awk '/^[a-z0-9]{8} /{print $0}'  # 匹配第一个字段是 8 个字符的行
tail /etc/services |awk '/blp5/ && /tcp/{print $0}'  # 匹配记录中包含 blp5 或 tcp 的行
awk '! /^#|^$/' /etc/nginx/nginx.conf                # 不匹配开头是#和空行
tail /etc/services |awk '/^blp5/,/^com/'             # 匹配以 "blp5开头" 到 "com开头" 之间的所有行

2.4 NF

echo "a b c d e f" |awk '{print NF}'                    # 打印行数
echo "a b c d e f" |awk '{print $1}'                    # 打印第一行
echo "a b c d e f" |awk '{print $NF}'                   # 打印最后一行
echo "a b c d e f" |awk '{print $(NF-1)}'               # 打印倒数第二行
echo "a b c d e f" |awk '{$NF="";$(NF-1)="";print $0}'  # 排除最后两个字段

2.5 NR

tail -n5 /etc/services |awk '{print NR,$0}'             # 打印行号+内容
tail -n5 /etc/services |awk 'NR==3{print $2}'           # 打印第三行第二列的值
tail -n5 /etc/services |awk 'NR<=3{print NR,$0}'        # 打印前三行

2.6 操作符

'''数字 0,空字符串和未定义的值 '''
seq 3 |awk '{print $0*2}'                               # 乘法
seq 3 |awk '{print $0/2}'                               # 除法
seq 5 |awk '$0%2==0{print $0}'                          # 取余
seq 5 |shuf |awk '{print $0|"sort"}'                    # 先打乱再排序

__END__