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乘法表