Grep AWK SED

字符三剑客. 文本处理工具.

  • grep 找出特定行.
  • awk 行拆分多字段
  • sed 更新插入删除等操作.

AWK

Aho、Peter Weinberger、Brian kernighan 三个创始人的首字母. 经典书籍 <<The AWK Programming Language>>

内建变量

$0 整行内容 $1~$n 当前记录的第n个字段

NF 当前记录中的字段个数,就是有多少列

NR 行号,从1开始,如果有多个文件话,这个值也是不断累加中。 FNR 行号, 与NR不同的是,这个值会是各个文件自己的行号

FILENAME 当前输入文件的名字

试例文本:

Proto Recv-Q Send-Q Local-Address          Foreign-Address             State
tcp        0      0 0.0.0.0:3306           0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:80             0.0.0.0:*                   LISTEN
tcp        0      0 127.0.0.1:9000         0.0.0.0:*                   LISTEN
tcp        0      0 coolshell.cn:80        124.205.5.146:18245         TIME_WAIT
tcp        0      0 coolshell.cn:80        61.140.101.185:37538        FIN_WAIT2
tcp        0      0 coolshell.cn:80        110.194.134.189:1032        ESTABLISHED
tcp        0      0 coolshell.cn:80        123.169.124.111:49809       ESTABLISHED
tcp        0      0 coolshell.cn:80        116.234.127.77:11502        FIN_WAIT2
tcp        0      0 coolshell.cn:80        123.169.124.111:49829       ESTABLISHED
tcp        0      0 coolshell.cn:80        183.60.215.36:36970         TIME_WAIT
tcp        0   4166 coolshell.cn:80        61.148.242.38:30901         ESTABLISHED
tcp        0      1 coolshell.cn:80        124.152.181.209:26825       FIN_WAIT1
tcp        0      0 coolshell.cn:80        110.194.134.189:4796        ESTABLISHED
tcp        0      0 coolshell.cn:80        183.60.212.163:51082        TIME_WAIT
tcp        0      1 coolshell.cn:80        208.115.113.92:50601        LAST_ACK
tcp        0      0 coolshell.cn:80        123.169.124.111:49840       ESTABLISHED
tcp        0      0 coolshell.cn:80        117.136.20.85:50025         FIN_WAIT2
tcp        0      0 :::22                  :::*                        LISTEN

输出 awk ‘{print + 列 }’

1/4 两列! $1…. $n 表示第几列. $0 表示所有列 也就像整行.

awk '{print $1,$4}' xx.sh

排列 / 格式化输出:awk ‘{printf }’

让文件按照一定顺序 排列输出, 每个字段占多少空间. 换行. 不设空间 或者空间设置过小,它都会每个字段之间 加一个空格来输出. 这样不好看. %s 代表有默认空间大小 .占多少就用多少. $5s 代表占5个空格 左边空格 右边内容,也就是右对齐. $-5s 代表占5个空格 左边内容 右边空格补全. 也就是左对齐.

awk '{print "%-8s %22s\n",$1,$4 }'

过滤输出: 输出符合条件的.

运算符: == 、!= 、< 、> 、<= 、>=

awk '$3==0 && $6=="LISTEN" ' uu.sh
> 第三+第六列 同时满足

awk '$3>0' uu.sh
> 第三列 大于0 的行.

输出表头 NR

表头: 也就是表的第一行.

awk '$3==0 && $6=="LISTEN" || NR==1 {printf "%-3s %-3s %s\n",$4,$5,$6} xx.sh
> 会输出表头/标题行

awk '$3==0 && $6=="LISTEN" {printf "%-3s %-3s %s\n",$4,$5,$6} xx.sh > 没有标题行

输出行号(实际行号.)

awk '$3==0 && $6=="ESTABLISHED" || NR==1 {printf "%02s %-4s %-20s %-20s %s\n",NR, FNR, $4,$5,$6}' uu

匹配内容:

awk '/LISTEN/' te.sh
>输出带有 LISTEN 的行.

awk '/LISTEN|TIME/' te.sh
输出带有 LISTEN或TIME 的行

awk '!/TIME/' te.sh
输出 不带有 TIME 的行.

拆分文件.(重定向)

字符三剑客.

文本处理工具.

  • grep 找出特定行.
  • awk 行拆分多字段
  • sed 更新插入删除等操作.

AWK

Aho、Peter Weinberger、Brian kernighan 三个创始人的首字母. 经典书籍 <<The AWK Programming Language>>

内建变量

$0 整行内容 $1~$n 当前记录的第n个字段

NF 当前记录中的字段个数,就是有多少列

NR 行号,从1开始,如果有多个文件话,这个值也是不断累加中。 FNR 行号, 与NR不同的是,这个值会是各个文件自己的行号

FILENAME 当前输入文件的名字

试例文本:

Proto Recv-Q Send-Q Local-Address          Foreign-Address             State
tcp        0      0 0.0.0.0:3306           0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:80             0.0.0.0:*                   LISTEN
tcp        0      0 127.0.0.1:9000         0.0.0.0:*                   LISTEN
tcp        0      0 coolshell.cn:80        124.205.5.146:18245         TIME_WAIT
tcp        0      0 coolshell.cn:80        61.140.101.185:37538        FIN_WAIT2
tcp        0      0 coolshell.cn:80        110.194.134.189:1032        ESTABLISHED
tcp        0      0 coolshell.cn:80        123.169.124.111:49809       ESTABLISHED
tcp        0      0 coolshell.cn:80        116.234.127.77:11502        FIN_WAIT2
tcp        0      0 coolshell.cn:80        123.169.124.111:49829       ESTABLISHED
tcp        0      0 coolshell.cn:80        183.60.215.36:36970         TIME_WAIT
tcp        0   4166 coolshell.cn:80        61.148.242.38:30901         ESTABLISHED
tcp        0      1 coolshell.cn:80        124.152.181.209:26825       FIN_WAIT1
tcp        0      0 coolshell.cn:80        110.194.134.189:4796        ESTABLISHED
tcp        0      0 coolshell.cn:80        183.60.212.163:51082        TIME_WAIT
tcp        0      1 coolshell.cn:80        208.115.113.92:50601        LAST_ACK
tcp        0      0 coolshell.cn:80        123.169.124.111:49840       ESTABLISHED
tcp        0      0 coolshell.cn:80        117.136.20.85:50025         FIN_WAIT2
tcp        0      0 :::22                  :::*                        LISTEN

输出 awk ‘{print + 列 }’

1/4 两列! $1…. $n 表示第几列. $0 表示所有列 也就像整行.

awk '{print $1,$4}' xx.sh

排列 / 格式化输出:awk ‘{printf }’

让文件按照一定顺序 排列输出, 每个字段占多少空间. 换行. 不设空间 或者空间设置过小,它都会每个字段之间 加一个空格来输出. 这样不好看. %s 代表有默认空间大小 .占多少就用多少. $5s 代表占5个空格 左边空格 右边内容,也就是右对齐. $-5s 代表占5个空格 左边内容 右边空格补全. 也就是左对齐.

awk '{print "%-8s %22s\n",$1,$4 }'

过滤输出: 输出符合条件的.

运算符: == 、!= 、< 、> 、<= 、>=

awk '$3==0 && $6=="LISTEN" ' uu.sh
> 第三+第六列 同时满足

awk '$3>0' uu.sh
> 第三列 大于0 的行.

输出表头 NR

表头: 也就是表的第一行.

awk '$3==0 && $6=="LISTEN" || NR==1 {printf "%-3s %-3s %s\n",$4,$5,$6} xx.sh
> 会输出表头/标题行

awk '$3==0 && $6=="LISTEN" {printf "%-3s %-3s %s\n",$4,$5,$6} xx.sh > 没有标题行

输出行号(实际行号.)

awk '$3==0 && $6=="ESTABLISHED" || NR==1 {printf "%02s %-4s %-20s %-20s %s\n",NR, FNR, $4,$5,$6}' uu

匹配内容:

awk '/LISTEN/' te.sh
>输出带有 LISTEN 的行.

awk '/LISTEN|TIME/' te.sh
输出带有 LISTEN或TIME 的行

awk '!/TIME/' te.sh
输出 不带有 TIME 的行.

拆分文件.(重定向)

例子:

找出 长度大于88 的行

awk 'length>88' xx.sh



打印 99 乘法表.

seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'

1