【树莓派不吃灰】命令篇⑦ 学习awk命令

在这里插入图片描述

  • ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️
  • ❤️ 本篇创建记录 2022-11-19 ❤️
  • ❤️ 本篇更新记录 2022-11-19 ❤️
  • 🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言 📝
  • 🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请留言轰炸哦!及时修正!感谢支持!
  • 🔥 Arduino ESP8266教程累计帮助过超过1W+同学入门学习硬件网络编程,入选过选修课程,刊登过无线电杂志🔥

awk 命令

参考资料:

AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。

把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。比较倾向于将一行分为数个“字段”来处理。
因为按照某种格式进行分割,所以对格式化的文本处理能力超强。

1. 基本语法

awk [选项参数] ‘pattern1{action1} pattern2{action2}…’ filename

常用选项参数:

  • -F:指定输入文件分隔符。
  • -v:赋值一个用户定义变量。
  • -f:引入awk执行脚本。

pattern

  • 表示AWK在数据中查找的内容,就是匹配模式。

action

  • 在找到匹配内容时所执行的一系列Linux命令。

注意:

行匹配语句 awk 只能用单引号。单引号内部可以使用双引号。

2. 工作原理

    1. 读入每一行记录
    1. 将记录按指定的域分隔符划分域,填充域(不够就补充)。

$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 内置变量

变量说明
FILENAMEawk浏览的文件名
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:~ $ 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

单片机菜鸟爱学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值