Linux三剑客之awk

2022-06-09  本文已影响0人  归源

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

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

语法

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

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

awk 中常用的内置变量

用法

以下示例多会使用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 '{ 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
# 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
# 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
# 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
>>>>
# 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

上一篇 下一篇

猜你喜欢

热点阅读