浅析Linux awk命令

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_41946557/article/details/102722331

 


示例:

[root@henu1 ~]# vi marks.txt

1)      George  English 100
2)      Didi    English 100
3)      George  English 100
4)      George  English 100
5)      George  English 100

[root@henu1 ~]# awk 'BEGIN{printf "SrNo\tName\tSub\tMarks\n"} {print}' marks.txt

[root@henu1 ~]# awk '{print}' marks.txt

[root@henu1 ~]# vi command.awk

{print}

[root@henu1 ~]# awk -f command.awk marks.txt


 基本用法:

log.txt文本内容如下:

2 this is a test
3 Are you like awk
This's a test
10 There are orange,apple,mongo

用法一:

awk '{[pattern] action}' {filenames}   # 行匹配语句 awk '' 只能用单引号

实例:

输出每一行的1、2列
awk '{print $1,$2}' log.txt  

格式化输出
awk '{printf "%-8s %-10s\n",$1,$4}' log.txt 


用法二: 

  • vi marks.txt

1),     George, English 100
2),     Didi,   English 100
3),     George, English 100
4),     George, English 100
5),     George, English 100

根据逗号切割
[root@henu1 ~]# awk -F, '{print $1,$2}' marks.txt

[root@henu1 ~]# awk 'BEGIN{FS=","} {print $1,$3}' marks.txt

[root@henu1 ~]# awk -F '[ ,]' '{print $1,$2,$1}' marks.txt

 


用法三:

[root@henu1 ~]# awk -va=1 '{print $1,$1+a}' log.txt

[root@henu1 ~]# awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt

用法四:

  • vi cal.awk
{print $1,$1+a,$1b}
[root@henu1 ~]# awk -va=1 -vb=s -f cal.awk log.txt


过滤第一列大于2的行

过滤第一列等于2的行

过滤第一列大于2并且第二列等于'Are'的行


输出顺序号 NR, 匹配文本行号

awk -F\' 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}'  log.txt

指定输出分割符



使用正则,字符串匹配

输出第二列包含 "th",并打印第二列与第四列

[root@henu1 ~]# awk '$2 ~ /th/ {print $2,$4}' log.txt

~ 表示模式开始。// 中是模式。

[root@henu1 ~]# awk '/re/' log.txt 


忽略大小写

[root@henu1 ~]# awk 'BEGIN{IGNORECASE=1} /this/' log.txt


模式取反

[root@henu1 ~]# awk '$2 !~ /th/ {print $2,$4}' log.txt 


awk脚本

关于awk脚本,我们需要注意两个关键词BEGIN和END。

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

假设有这么一个文件(学生成绩表):

  • vi 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
  • vi cal.awk
#!bin/awk -f
#运行前
BEGIN {
        math = 0
        english = 0
        computer = 0

        print "NAME     NO.     MATH    ENGLISH  COMPUTER  TOTAL\n"
        print "-----------------------------------\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
}


猜你喜欢

转载自blog.csdn.net/qq_41946557/article/details/102722331