shell命令:awk命令

看如下命令:

ls -l
#----------------------------下面是输出-----------------------------------
total 2724
drwxr-xr-x 3 root root    4096 May 14 10:54 kafka_test
-rw-r--r-- 1 root root 2739670 Jan 18 09:35 ojdbc6.jar

awk获取指定列:

ls -l | awk '{print $1}'  #获取第一列(默认分割符是空格或tab)
#----------------------------下面是输出-----------------------------------
total
drwxr-xr-x
-rw-r--r--

#如果不想要第一行, 要第一列和最后两列
ls -l | awk 'NR != 1 {print $1, $(NF-1), $NF}'  #NR表示行,NF表示总列数
#----------------------------下面是输出-----------------------------------
drwxr-xr-x 10:54 kafka_test
-rw-r--r-- 09:35 ojdbc6.jar

筛选条件:

ls -l | awk '$1 ~ /^d/ {print $1, $(NF-1), $NF}'  #输出第1列为字母d开头的行(~表示匹配开始,/ /之间是正则表达式)
# ls -l | awk '$1 !~ /^d/ {print $1, $(NF-1), $NF}' #输出第1列非字母d开头的行
#----------------------------下面是输出-----------------------------------
drwxr-xr-x 10:54 kafka_test

ls -l | awk '$3=="root" && $5>10000 {print $1, $3, $5, $NF}'  #输出第3列为root,第5列大于10000的行
#----------------------------下面是输出-----------------------------------
-rw-r--r-- root 2739670 ojdbc6.jar

ls -l | awk '$3=="root" && $5>10000 || NR==1 {print $1, $3, $5, $NF}' #同时还输出第一行
#----------------------------下面是输出-----------------------------------
total   2704
-rw-r--r-- root 2739670 ojdbc6.jar

指定分隔符:

head -n 3 /etc/passwd
#----------------------------下面是输出-----------------------------------
root:x:0:0:root:/root:/bin/bash    
bin:x:1:1:bin:/bin:/sbin/nologin   
daemon:x:2:2:daemon:/sbin:/sbin/nologin

awk -F ":" 'NR<=3 {print $1, $NF}' /etc/passwd  #指定:为分隔符
#----------------------------下面是输出-----------------------------------
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin

awk -F ":" 'NR<=3 {print $1, $NF}' OFS="\t" /etc/passwd  #指定输出的分隔符为tab
#----------------------------下面是输出-----------------------------------
root    /bin/bash
bin     /sbin/nologin
daemon  /sbin/nologin

BEGIN和END:
BEGIN{ 这里面放的是执行前的语句 }
{这里面放的是处理每一行时要执行的语句}
END {这里面放的是处理完所有的行后要执行的语句 }

cat score.txt
#----------------------------下面是输出-----------------------------------
Marry   2143 78 84 77
Jack    2321 66 78 45
Tom     2122 48 77 71
Mike    2537 87 97 95
Bob     2415 40 57 62

#运行前
awk 'BEGIN {
    math = 0
    english = 0
    computer = 0
 
    printf "NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL\n"
    printf "---------------------------------------------\n"
}
# 运行中
{
    math+=$3
    english+=$4
    computer+=$5
    printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5
}
# 运行后
END {
    printf "---------------------------------------------\n"
    printf "  TOTAL:%10d %8d %8d \n", math, english, computer
    printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR
}' score.txt
#----------------------------下面是输出-----------------------------------
NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL
---------------------------------------------
Marry  2143     78       84       77      239
Jack   2321     66       78       45      189
Tom    2122     48       77       71      196
Mike   2537     87       97       95      279
Bob    2415     40       57       62      159
---------------------------------------------
  TOTAL:       319      393      350
AVERAGE:     63.80    78.60    70.00

技巧:

awk 'length>80' file  #输出长度大于80的行
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")}'  #打印99乘法表
posted @ 2018-12-17 09:03  xuejianbest  阅读(823)  评论(0编辑  收藏  举报