当前位置: 移动技术网 > 科技>操作系统>Linux > Shell 编程 编辑工具 awk

Shell 编程 编辑工具 awk

2019年10月16日  | 移动技术网科技  | 我要评论

centos-logo

本篇主要写一些shell脚本编辑工具awk的使用。


概述

awk是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理。

awk倾向于将一行分成多个字段然后再进行处理,且默认情况下字段的分隔符为空格或者tab键。awk执行结果可以通过print的功能将字段数据打印显示。

可以使用逻辑操作符&&,表示||表示!表示;还可以进行简单的数学运算,如+-*/%^分别表示取余乘方

命令常见用法

  • 命令有两种格式:
awk [选项] '模式或条件{编辑指令}' 文件 1 文件 2...
awk -f 脚本文件 文件 1 文件 2...
  • 常见的内置变量

fs:指定每行文本的字段分隔符,默认为空格或制表位。
nf:当前处理的行的字段个数。
nr:当前处理的行的行号(序数)。
$0:当前处理的行的整行内容。
$n:当前处理行的第n个字段(第n列)。
rs:数据记录分隔,默认为\n,即每行为一条记录。
filename:被处理的文件名。

示例

按行输出文本

  • 输出所有内容
[root@localhost ~]# 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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:ftp user:/var/ftp:/sbin/nologin
nobody:x:99:99:nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd network management:/:/sbin/nologin
dbus:x:81:81:system message bus:/:/sbin/nologin
polkitd:x:999:997:user for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:privilege-separated ssh:/var/empty/sshd:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
[root@localhost ~]# awk '{print $0}' /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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:ftp user:/var/ftp:/sbin/nologin
nobody:x:99:99:nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd network management:/:/sbin/nologin
dbus:x:81:81:system message bus:/:/sbin/nologin
polkitd:x:999:997:user for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:privilege-separated ssh:/var/empty/sshd:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
  • 输出第1~3
[root@localhost ~]# awk 'nr==1,nr==3{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
[root@localhost ~]# awk '(nr>=1)&&(nr<=3){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
[root@localhost ~]# awk 'nr>=1&&nr<=3{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
  • 输出第1行,第3
[root@localhost ~]# awk '(nr==1)||(nr==3){print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@localhost ~]# awk 'nr==1||nr==3{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
  • 输出所有奇数行
[root@localhost ~]# awk '(nr%2)==1{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
nobody:x:99:99:nobody:/:/sbin/nologin
dbus:x:81:81:system message bus:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
  • 输出所有偶数行
[root@localhost ~]# awk '(nr%2)==0{print}' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:ftp user:/var/ftp:/sbin/nologin
systemd-network:x:192:192:systemd network management:/:/sbin/nologin
polkitd:x:999:997:user for polkitd:/:/sbin/nologin
sshd:x:74:74:privilege-separated ssh:/var/empty/sshd:/sbin/nologin
  • 输出以root开头的行
[root@localhost ~]# awk '/^root/{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
  • 输出以/bin/bash结尾的行
[root@localhost ~]# awk '/\/bin\/bash$/{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
  • 统计以/bin/bash结尾的行数
[root@localhost ~]# awk 'begin{x=0};/\/bin\/bash$/{x++};end{print x}' /etc/passwd
1
[root@localhost ~]# grep -c '/bin/bash$' /etc/passwd
1
[root@localhost ~]# grep '/bin/bash$' /etc/passwd | wc -l
1
  • 统计以:分隔的文本段落数
[root@localhost ~]# awk 'begin{rs=":"};end{print nr}' /etc/passwd
115

按字段输出文本

  • 输出每行中的第3个字段
[root@localhost ~]# awk -f":" '{print $3}' /etc/passwd
0
1
2
3
4
5
6
7
8
11
12
14
99
192
81
999
89
74
998
  • 输出每行中的第13个字段
[root@localhost ~]# awk -f":" '{print $1,$3}' /etc/passwd
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8
operator 11
games 12
ftp 14
nobody 99
systemd-network 192
dbus 81
polkitd 999
postfix 89
sshd 74
chrony 998
  • 输出uid0的用户记录
[root@localhost ~]# awk -f":" '$3=="0"{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]# awk 'begin{fs=":"};$3=="0"{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
  • 输出第7个字段包含/bin/bash的行的第1个字段
[root@localhost ~]# awk -f":" '$7~"/bin/bash"{print $1}' /etc/passwd
root
  • 输出第1个字段包含sshd且包含7个字段的行中第137个字段
[root@localhost ~]# awk -f":" '($1~"sshd")&&(nf==7){print $1,$3,$7}' /etc/passwd
sshd 74 /sbin/nologin
  • 输出第7个字段既不是/bin/bash也不是/sbin/nologin的所有行
[root@localhost ~]# awk -f":" '($7!="/bin/bash")&&($7!="/sbin/nologin"){print}' /etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt

管道、双引号调用 shell 命令

  • 使用wc -l统计使用bash的用户个数
[root@localhost ~]# awk -f":" '/bash$/{print | "wc -l"}' /etc/passwd
1
  • 调用w命令,并统计在线用户数
[root@localhost ~]# awk 'begin{while("w" | getline)n++;{print n-2}}'
1
  • 调用hostname,并输出当前主机名
[root@localhost ~]# awk 'begin{"hostname" | getline;print $0}'
localhost

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网