Shell 编程 编辑工具 awk
2024-08-29 07:57:09
本篇主要写一些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
- 输出每行中的第
1
、3
个字段
[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
- 输出
UID
为0
的用户记录
[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
个字段的行中第1
、3
、7
个字段
[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
最新文章
- 如何在ASP.NET 5上搭建基于TypeScript的Angular2项目
- HTML 学习笔记 CSS(选择器2)
- 小试牛刀3之JavaScript基础题
- svnadmin:error while loading shared libraries: libaprutil-1.so.0:cannot open shared object file: No such file or directory
- 让WPS支持VHDL的关键词加粗
- [转载]MongoDB学习 (五):查询操作符(Query Operators).1st
- 什么是Web Service?
- 依赖和用jar包得区别
- js基础语法习题补充
- c# 浮点数计算问题
- Vue之彻底理解自定义组件的v-model
- 程序员听到bug后的N种反应,太形象了
- linux之x86裁剪移植---grub 识别文件系统
- SQL执行计划分析
- C++Primer学习——未定义行为
- 【深度学习】--GAN从入门到初始
- P5302 [GXOI/GZOI2019]特技飞行
- Dynamics 365权限变化大部署后需要注意什么?
- centos7下安装部署mongodb集群(副本集模式)
- Using the SDRAM on Altera’s DE1-SoC Board with Verilog Designs
热门文章
- NOIP 2002 产生数
- openlayers上添加点击事件
- Shell编程——test命令
- Ubuntu安装微信、钉钉等各种windows软件
- 花一天时间踩了node npm的一个坑
- linux开启tcp_timestamps和tcp_tw_recycle引发的问题研究
- Spring Security简介与入门Demo
- MySQL的统计总数count(*)与count(id)或count(字段)的之间的各自效率性能对比
- Sitecore个性化 - 基础知识
- Linux常用命令:fdisk mkfs mount umount fstab实现自动挂载