Linux三剑客之awk

除了 grep 命令外,Linux操作系统中还有两个不得不的掌握的工具--- awksedgrep 适用于从文件或终端输出中匹配指定模式的行内容, awk 作为一个文本处理工具,在处理表格类的文本是显得更加得心应手,而 sed 则更关注于针对文本完成复杂的编辑功能。

awk 是一种操作数据和生成报告的脚本语言,通过在所接收到的文本文件中逐行匹配模式并完成指定操作的功能。在 awk 表达式中,你可以自己定义使用变量、函数、字符串函数和逻辑运算符。

语法

awk [options] 'selection_criteria {action}' input-file > output-file

awk 支持的options中,如下是其中最常用的两个

  • -F fs: 使用出入的字段作为分割符
  • -f program-file: 使用出入的文件代替输入的第一个命令行参数

awk 中常用的内置变量

  • FS: (输入)字段分割符。默认为空格
  • NF: awk对输入文件处理时会使用逐行处理的方式,NF 为使用分割符对行内容进行切分后的域(字段)
  • NR: 使用时会输出在输入文件的每行前加上行号
  • RS: 指定输入记录的每行的分割符,默认RS为"\n"
  • OFS: (输出)字段分割符。默认为空格
  • ORS: 指定输出记录的每行的分割符。默认ORS为"\n"
  • BEGIN: 执行指定前先执行BEGIN变量后定义的语句
  • END: 执行指令后执行END变量后定义的语句
  • if: 使用if条件判断。格式为 '{ if(xx==xx) print xx; }'

用法

以下示例多会使用Linux操作系统上的用户文件/etc/passwd,以如下内容为例

#cat < /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
adm:x:3:4:adm:/var/adm:/sbin/nologin
  • 默认情况下awk会逐行扫描输入文件,并输出文件的所有内容
# awk '{ print }' /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
adm:x:3:4:adm:/var/adm:/sbin/nologin
  • 指定分隔符':',输出用户文件的用户名及登录所使用的终端
# awk -F':' '{ print $1,$NF }' /etc/passwd
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
  • 匹配指定模式的内容并输出切分后的指定域
    注意: NF 与 NF 的输出并不相同。NF 表示awk处理输入文件行的域,NF 表示第几域的内容
# awk -F':' ' /root/ { print $1,$NF }' /etc/passwd    # 匹配用户文件中包含root的行,并根据分割符切分出指定的域,输出第一个域和最后一个域 
root /bin/bash
# awk -F':' ' /root/ { print $1,NF }' /etc/passwd
root 7
  • 指定分割符':',并输出第一个域及对应的行号
# awk -F':' '{ print NR,$1 }' /etc/passwd
1 root
2 bin
3 daemon
4 adm
  • 指定分割符':',输出用户文件中对应用户名、用户id、组id、登录后使用的终端对应的第一、三、四、七域
# awk -F':' '{ print $1,$3,$4,$7 }' /etc/passwd
root 0 0 /bin/bash
bin 1 1 /sbin/nologin
daemon 2 2 /sbin/nologin
adm 3 4 /sbin/nologin
  • 指定(域)分割符':',并指定每行记录的分割符'****\n'输出用户文件的第一域
# awk -F':' ' RS="****\n" { print $1,RS }' /etc/passwd      # 在这里, RS="****\n" 实际上在输出的域之后加上了 ****,\n 则为换行
root ****

bin ****

daemon ****

adm ****

  • 指定(域)分割符':',输出指定多少行的记录
# awk -F':' ' NR==2,NR==4 { print NR,$1 }' /etc/passwd      # 输出2,3,4 行的第一域
2 bin
3 daemon
4 adm
# awk -F':' ' NR > 1,NR < 4 { print NR "\t" $1 }' /etc/passwd       # \t 为制表符
2   bin
3   daemon
4   adm
  • 输出文件的行记录
# awk -F':' ' END { print NR }' /etc/passwd
4
  • 执行指令前后添加输出
# awk -F':' ' BEGIN { print ">>>>>>>>>>>"} { print NR } END { print "<<<<<<<<<<<<"  } ' /etc/passwd
>>>>>>>>>>>
1
2
3
4
<<<<<<<<<<<<
# awk -F':' ' BEGIN { for(i=1;i<=5;i++) print "The num is: "i  } ' /etc/passwd
The num is: 1
The num is: 2
The num is: 3
The num is: 4
The num is: 5
  • 输出时指定输出行的域分割符
# awk -F':' ' OFS="\t" { print $1,$NF }' /etc/passwd
root    /bin/bash
bin    /sbin/nologin
daemon    /sbin/nologin
adm    /sbin/nologin
  • 输出时指定输出记录的分割符
# awk -F':' ' ORS="\n>>>>\n" { print $1,$NF }' /etc/passwd      # 每一行为一条记录,因此会在行后输出">>>>\n"
root /bin/bash
>>>>
bin /sbin/nologin
>>>>
daemon /sbin/nologin
>>>>
adm /sbin/nologin
>>>>
  • 使用if条件输出匹配的行
# awk -F':' ' { if($1=="root") print $0; } ' /etc/passwd
root:x:0:0:root:/root:/bin/bash
# awk -F':' ' { if($4>3) print $0; } ' /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
  • 输出每行记录的长度
# awk -F':' '{ print length($0) }' /etc/passwd  # $0 为每行的所有域
31
32
39
36

参考:
https://www.geeksforgeeks.org/awk-command-unixlinux-examples/
http://c.biancheng.net/view/4082.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,290评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,107评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,872评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,415评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,453评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,784评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,927评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,691评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,137评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,472评论 2 326
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,622评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,289评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,887评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,316评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,490评论 2 348

推荐阅读更多精彩内容