目录
- awk 命令
- 1. 基本语法
- 2. 工作原理
- 3. 基础实例操作
- 3.1 把用户名和Shell打印出来
- 3.2 找到以ssh关键字开头的所有行,并输出用户名和shell,中间以“-”分割
- 3.3 给用户 ID加上一个常量
- 3.4 输出第一个字段为sshd所在的行
- 4. BEGIN END 操作
- 4.1 基于3.2,在行前面添加user,shell,最后一行添加 dpjcn-/sbin/root
- 5. 常用awk 内置变量
- 5.1 统计passwd每行的行号,每行的列数
- 5.2 打印第三行的所有数据
- 5.3 打印第三行的第7列数据
- ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️
- ❤️ 本篇创建记录 2022-11-19 ❤️
- ❤️ 本篇更新记录 2022-11-19 ❤️
- 🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言 📝
- 🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请留言轰炸哦!及时修正!感谢支持!
- 🔥 Arduino ESP8266教程累计帮助过超过1W+同学入门学习硬件网络编程,入选过选修课程,刊登过无线电杂志🔥
awk 命令
参考资料:
- https://www.runoob.com/linux/linux-comm-awk.html
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。
把文件
逐行的读入
,以空格为默认分隔符将每行切片
,切开的部分再进行分析处理。比较倾向于将一行分为数个“字段”来处理。
因为按照某种格式进行分割,所以对格式化的文本处理能力超强。
1. 基本语法
awk [选项参数] ‘pattern1{action1} pattern2{action2}…’ filename
常用选项参数:
-F
:指定输入文件分隔符。-v
:赋值一个用户定义变量。-f
:引入awk执行脚本。
pattern:
- 表示AWK在数据中查找的内容,就是匹配模式。
action:
- 在找到匹配内容时所执行的一系列Linux命令。
注意:
行匹配语句 awk 只能用单引号。单引号内部可以使用双引号。
2. 工作原理
-
- 读入每一行记录
-
- 将记录按指定的
域分隔符
划分域,填充域(不够就补充)。
- 将记录按指定的
$0
则表示所有域,$1
表示第一个域,$n
表示第n个域,$NF
表示文本行中的最后一个数据字段。
3. 基础实例操作
我们以 /etc/passwd 文件为例子。
pi@raspberrypi:~ $ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:100:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
_apt:x:102:65534::/nonexistent:/usr/sbin/nologin
pi:x:1000:1000:,,,:/home/pi:/bin/bash
systemd-timesync:x:103:109:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
messagebus:x:104:110::/nonexistent:/usr/sbin/nologin
_rpc:x:105:65534::/run/rpcbind:/usr/sbin/nologin
statd:x:106:65534::/var/lib/nfs:/usr/sbin/nologin
sshd:x:107:65534::/run/sshd:/usr/sbin/nologin
avahi:x:108:113:Avahi mDNS daemon,,,:/run/avahi-daemon:/usr/sbin/nologin
dnsmasq:x:109:65534:dnsmasq,,,:/var/lib/misc:/usr/sbin/nologin
lightdm:x:110:114:Light Display Manager:/var/lib/lightdm:/bin/false
rtkit:x:111:116:RealtimeKit,,,:/proc:/usr/sbin/nologin
pulse:x:112:119:PulseAudio daemon,,,:/run/pulse:/usr/sbin/nologin
saned:x:113:122::/var/lib/saned:/usr/sbin/nologin
colord:x:114:123:colord colour management daemon,,,:/var/lib/colord:/usr/sbin/nologin
hplip:x:115:7:HPLIP system user,,,:/run/hplip:/bin/false
epmd:x:116:124::/run/epmd:/usr/sbin/nologin
geoclue:x:117:125::/var/lib/geoclue:/usr/sbin/nologin
systemd-coredump:x:996:996:systemd Core Dumper:/:/usr/sbin/nologin
motion:x:118:126::/var/lib/motion:/usr/sbin/nologin
可以看到都是格式化文本。
aaa:bbb:ccc:ddd
/etc/passwd
文件将每个用户的基本信息记录为文件中的一行,一行中包含 7 个
字段。每个字段之间用冒号“:” 分隔(以sshd:x:107:65534::/run/sshd:/usr/sbin/nologin
为例子)。
- (1)用户名 (sshd): 已创建用户的用户名,字符长度 1 个到 12 个字符。如果是“
*
”的话,那么就表示该账号被查封了,系统不允许持有该账号的用户登录。 - (2)密码(x):代表加密密码,保存在
/etc/shadow
文件中。 - (3)用户 ID(107):代表用户的 ID 号,每个用户都要有一个唯一的 ID 。UID 号为 0 的是为 root 用户保留的,UID 号 1 到99 是为系统用户保留的,UID 号 100-999 是为系统账户和群组保留的。
- (4)群组 ID (65534):代表user1用户所属群组的 ID 号,每个群组都要有一个唯一的 GID ,群组信息保存在
/etc/group
文件中。 - (5)用户信息():代表描述字段,可以用来描述用户的信息。
- (6)主目录(/run/sshd):代表用户的主目录。
- (7)Shell(/usr/sbin/nologin):代表用户使用的 shell 类型。
3.1 把用户名和Shell打印出来
执行命令:
awk -F: ‘{print $1,$7}’ /etc/passwd
命令分析:
-F:
指定分隔符为:
。
print $1,$7
表示打印第一列和第七列。
执行结果:
pi@raspberrypi:~ $ awk -F: '{print $1,$7}' /etc/passwd
root /bin/bash
daemon /usr/sbin/nologin
bin /usr/sbin/nologin
sys /usr/sbin/nologin
sync /bin/sync
games /usr/sbin/nologin
man /usr/sbin/nologin
lp /usr/sbin/nologin
mail /usr/sbin/nologin
news /usr/sbin/nologin
uucp /usr/sbin/nologin
proxy /usr/sbin/nologin
www-data /usr/sbin/nologin
backup /usr/sbin/nologin
list /usr/sbin/nologin
irc /usr/sbin/nologin
gnats /usr/sbin/nologin
nobody /usr/sbin/nologin
systemd-network /usr/sbin/nologin
systemd-resolve /usr/sbin/nologin
_apt /usr/sbin/nologin
pi /bin/bash
systemd-timesync /usr/sbin/nologin
messagebus /usr/sbin/nologin
_rpc /usr/sbin/nologin
statd /usr/sbin/nologin
sshd /usr/sbin/nologin
avahi /usr/sbin/nologin
dnsmasq /usr/sbin/nologin
lightdm /bin/false
rtkit /usr/sbin/nologin
pulse /usr/sbin/nologin
saned /usr/sbin/nologin
colord /usr/sbin/nologin
hplip /bin/false
epmd /usr/sbin/nologin
geoclue /usr/sbin/nologin
systemd-coredump /usr/sbin/nologin
motion /usr/sbin/nologin
pi@raspberrypi:~ $
3.2 找到以ssh关键字开头的所有行,并输出用户名和shell,中间以“-”分割
执行命令:
awk -F: ‘/^ssh/{print $1"-"$7}’ /etc/passwd
命令分析:
-F:
指定分隔符为:
。
print $1"-"$7
表示打印第一列和第七列。中间分割符“-”
/^ssh/
表示一个正则表达式,以ssh开头
执行结果:
pi@raspberrypi:~ $ awk -F: '/^ssh/{print $1"-"$7}' /etc/passwd
sshd-/usr/sbin/nologin
3.3 给用户 ID加上一个常量
执行命令:
awk -F: -v i=1 ‘{print $1"-"$3+i}’ /etc/passwd
命令分析:
-F:
指定分隔符为:
。
-v i=1
表示定义用户变量i,其值等于1。
print $1"-"$3+i
表示打印第一列和第三列。中间分割符“-”,并且第三列加上用户变量i的值。
执行结果:
pi@raspberrypi:~ $ awk -F: -v i=1 '{print $1"-"$3+i}' /etc/passwd
root-1
daemon-2
bin-3
sys-4
sync-5
games-6
man-7
lp-8
mail-9
news-10
uucp-11
proxy-14
www-data-34
backup-35
list-39
irc-40
gnats-42
nobody-65535
systemd-network-101
systemd-resolve-102
_apt-103
pi-1001
systemd-timesync-104
messagebus-105
_rpc-106
statd-107
sshd-108
avahi-109
dnsmasq-110
lightdm-111
rtkit-112
pulse-113
saned-114
colord-115
hplip-116
epmd-117
geoclue-118
systemd-coredump-997
motion-119
pi@raspberrypi:~ $
3.4 输出第一个字段为sshd所在的行
执行命令:
awk -F: ‘$1==“sshd”{print $0}’ /etc/passwd
执行结果:
pi@raspberrypi:~ $ awk -F: '$1=="sshd"{print $0}' /etc/passwd
sshd:x:107:65534::/run/sshd:/usr/sbin/nologin
pi@raspberrypi:~ $
4. BEGIN END 操作
在执行awk命令的前后,我们可以通过 BEGIN END 两个表达式新增一些前后显示。
语法:
awk [选项参数] BEGIN{action1} PROGRAM{action2} END{action3} filename
BEGIN
是优先级最高的代码块,是在执行PROGRAM之前执行的,不需要提供数据源,因为不涉及到任何数据的处理,也不依赖与PROGRAM代码块;
PROGRAM是对数据流干什么,是必选代码块,也是默认代码块。所以在执行时必须提供数据源;
END是处理完数据流后的操作,如果需要执行END代码块,就必须需要PROGRAM的支持,单个无法执行。
总结起来awk程序运行优先级是:
- 1)BEGIN: 在开始处理数据流之前执行,可选项
- 2)program: 如何处理数据流,必选项
- 3)END: 处理完数据流后执行,可选项
4.1 基于3.2,在行前面添加user,shell,最后一行添加 dpjcn-/sbin/root
执行命令:
awk -F: ‘BEGIN{print “user,shell”} /^ssh/{print $1"-"$7} END{print “dpjcn-/sbin/root”}’ /etc/passwd
执行结果:
pi@raspberrypi:~ $ awk -F: 'BEGIN{print "user,shell"} /^ssh/{print $1"-"$7} END{print "dpjcn-/sbin/root"}' /etc/passwd
user,shell
sshd-/usr/sbin/nologin
dpjcn-/sbin/root
pi@raspberrypi:~ $
5. 常用awk 内置变量
变量 | 说明 |
---|---|
FILENAME | awk浏览的文件名 |
NR | 已读的记录数 |
NF | 浏览记录的域的个数 |
5.1 统计passwd每行的行号,每行的列数
执行命令:
awk -F: ‘{print “line:” NR “-” “col:” NF}’ /etc/passwd
执行结果:
pi@raspberrypi:~ $ awk -F: '{print "line:" NR "-" "col:" NF}' /etc/passwd
line:1-col:7
line:2-col:7
line:3-col:7
line:4-col:7
line:5-col:7
line:6-col:7
line:7-col:7
line:8-col:7
line:9-col:7
line:10-col:7
line:11-col:7
line:12-col:7
line:13-col:7
line:14-col:7
line:15-col:7
line:16-col:7
line:17-col:7
line:18-col:7
line:19-col:7
line:20-col:7
line:21-col:7
line:22-col:7
line:23-col:7
line:24-col:7
line:25-col:7
line:26-col:7
line:27-col:7
line:28-col:7
line:29-col:7
line:30-col:7
line:31-col:7
line:32-col:7
line:33-col:7
line:34-col:7
line:35-col:7
line:36-col:7
line:37-col:7
line:38-col:7
line:39-col:7
pi@raspberrypi:~ $
5.2 打印第三行的所有数据
执行命令:
awk ‘NR==3{print $0}’ /etc/passwd
执行结果:
pi@raspberrypi:~ $ awk 'NR==3{print $0}' /etc/passwd
bin:x:2:2:bin:/bin:/usr/sbin/nologin
pi@raspberrypi:~ $
5.3 打印第三行的第7列数据
执行命令:
awk -F: ‘NR==3{print $7}’ /etc/passwd
执行结果:
pi@raspberrypi:~ $ awk -F: 'NR==3{print $7}' /etc/passwd
/usr/sbin/nologin
pi@raspberrypi:~ $