一、前言¶
本文通过以下几个方面介绍Linux中文本三剑客:
- 特殊符号
- 正则表达式
- 文本三剑客详细用法
二、特殊符号¶
2.1 引号系列¶
| 引号 | 含义 |
|---|---|
| 单引号 | 所见即所得,单引号里面的内容会原封不动输出 |
| 双引号 | 和单引号类似,对双引号里面的特殊符号会进行解析,对于{}花括号(通配符)没有解析 |
| 不加引号 | 和双引号类似,额外支持通配符(匹配文件) *.log |
| 反引号 | 优先执行,先执行反引号里面的命令 |
单引号示例:
[root@k8s-node01 ~]# echo '`hostname` aaa $(whoami) $UID {1..5}'
`hostname` aaa $(whoami) $UID {1..5}
双引号示例:
[root@k8s-node01 ~]# echo "`hostname` aaa $(whoami) $UID {1..5}"
k8s-node01 aaa root 0 {1..5}
不加引号示例:
[root@k8s-node01 ~]# echo `hostname` aaa $(whoami) $UID {1..5}
k8s-node01 aaa root 0 1 2 3 4 5
2.2 重定向符号系列¶
| 重定向符号 | 含义 | 应用场景 |
|---|---|---|
| > 或 1> | 标准输出重定向: 先清空文件,然后写入 | 大部分情况下先清空的时候可以使用. 创建文件 |
| >> 或 1>> | 标准输出追加重定向: 直接写入到文件末尾 | 修改配置文件,表示追加的时候 |
| 2> | 标准错误输出重定向: 先清空文件,然后写入错误信息 | 较少单独用,一般用于获取所有输出 |
| 2>> | 标准错误追加输出重定向: 直接把错误写入到文件末尾 | 较少单独用,一般用于获取所有输出 |
| 命令 >>zq.log 2>&1 | 无论对错都把结果写入到文件中 | 比较常用,定时任务,脚本中常用 |
| 命令 &>>zq.log | 无论对错都把结果写入到文件中 | 比较常用,定时任务,脚本中常用 |
| < 或 0< | 标准输入重定向 | 很少用,搭配某几个命令用xargs,tr |
| << 或 0<< | 标准输入追加重定向 | 与cat搭配使用表示向文件写入多行内容,格式内容为cat >文件名<<结束标记 |
标准输出追加重定向示例:
[root@k8s-node01 ~]# echo aaa >> aaa.txt
[root@k8s-node01 ~]# cat aaa.txt
aaa
标准错误追加输出重定向示例:
[root@k8s-node01 ~]# ech aaa >> aaa.txt
[root@k8s-node01 ~]# cat aaa.txt
-bash: ech: command not found
无论对错都把结果写入到文件中示例:
[root@k8s-node01 ~]# ech aaa >> aaa.txt 2>&1
[root@k8s-node01 ~]# cat aaa.txt
-bash: ech: command not found
上面写法也可以简写成
[root@k8s-node01 ~]# ech aaa &>>aaa.txt
[root@k8s-node01 ~]# cat aaa.txt
-bash: ech: command not found
标准输入重定向示例:
[root@k8s-node01 ~]# seq 10 >num.txt
[root@k8s-node01 ~]# xargs -n3 <num.txt
1 2 3
4 5 6
7 8 9
10
追加输出重定向示例:
[root@k8s-node01 ~]# cat >a.txt<<EOF
> I
> love
> linux
> EOF
[root@k8s-node01 ~]# cat a.txt
I
love
linux
2.3 通配符¶
| 符号 | 含义 |
|---|---|
| * | 所有 , .txt .log 'ip' |
| {} | 输出序列,与echo,touch,mkdir |
| [] | 参考正则中含义即可 |
| [!] [^] | 取反 |
| ? | 任意一个字符 |
输出等宽的数字序列
[root@k8s-node01 ~]# echo {01..10}
01 02 03 04 05 06 07 08 09 10
输出1-10中的奇数
[root@k8s-node01 ~]# echo {1..10..2}
1 3 5 7 9
备份某个文件
[root@k8s-node01 ~]# cp a.txt{,.bak}
[root@k8s-node01 ~]# ls a.txt*
a.txt a.txt.bak
输出以某个字符固定开头的文件
[root@k8s-node01 ~]# echo A{,B}
A AB
[root@k8s-node01 ~]# echo A{C,B}
AC AB
找出/bin目录下面命令,命令仅有2个字符组成
[root@k8s-node01 ~]# ls -l /bin/??
-rwxr-xr-x. 1 root root 62680 Oct 2 2020 /bin/ar
-rwxr-xr-x. 1 root root 386424 Oct 2 2020 /bin/as
-rwxr-xr-x. 1 root root 83424 Jun 10 2014 /bin/bc
-rwxr-xr-x. 1 root root 26 Apr 1 2020 /bin/bg
lrwxrwxrwx. 1 root root 3 Sep 27 23:11 /bin/cc -> gcc
-rwxr-xr-x. 1 root root 26 Apr 1 2020 /bin/cd
三、正则表达式¶
3.1 正则概述¶
正则(正则表达式)是一种强大的文本匹配和处理工具,用于在文本中查找、匹配和处理符合特定模式的字符串。正则表达式是一种模式描述语言,它允许你指定文本中需要匹配的模式,这些模式可以包括字符、字符类、重复次数、分组和逻辑操作符等。
3.2 正则与通配符区别¶
| 区别 | 用途(找的内容不同) | 支持的命令不同 |
|---|---|---|
| 正则 | 匹配文件内容(匹配字符) | 三剑客支持,开发语言 |
| 通配符 | 匹配文件(命令参数) | Linux大部分命令都支持 |
3.3 正则分类¶
| 分类 | 符号 |
|---|---|
| 基础正则BRE (Basic RE) | ^ $ ^$ . * .* [] [^] |
| 扩展正则ERE (Extended RE) | | + () {} ? |
| Perl语言正则(其他) |
3.3.1 基础正则¶
| 基础正则 | 含义 |
|---|---|
| ^ | 以xxx开头的行 |
| $ | 以...结尾的行 |
| ^$ | 空行 |
| . | 任意一个字符 |
| \ | 转义字符 |
| * | 前一个字符出现0次或0次以上 |
| .* | 所有 |
| [] | [abc] a或b或c, []相当于是1个字符 |
| [^] | [^abc] 匹配除了abc之外的内容, []相当于是1个字符 |
1、^ 以....开头的行
以l开头的行
[root@k8s-node01 ~]# cat a.txt
I
love
linux
[root@k8s-node01 ~]# grep '^l' a.txt
love
linux
2、$ 以....结尾的行
以x结尾的行
[root@k8s-node01 ~]# cat a.txt
I
love
linux
[root@k8s-node01 ~]# grep 'x$' a.txt
linux
使用cat -A命令可以显示出文件中的特殊隐藏符号
[root@k8s-node01 ~]# cat -A a.txt
I$
love$
linux$
3、^$ 空行,这行中没有任何字符
过滤出文件中的空行并显示行号
[root@k8s-node01 ~]# cat a.txt
I
love
linux
[root@k8s-node01 ~]# grep -n '^$' a.txt
2:
排除空行
[root@k8s-node01 ~]# cat a.txt
I
love
linux
[root@k8s-node01 ~]# grep -vn '^$' a.txt
1:I
3:love
4:linux
排除/etc/ssh/sshd_config文件中的空行,然后排除以#号开头的行
[root@k8s-node01 ~]# grep -v '^$' /etc/ssh/sshd_config | grep -v '^#'
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
SyslogFacility AUTHPRIV
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials no
UsePAM yes
X11Forwarding yes
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
Subsystem sftp /usr/libexec/openssh/sftp-server
4、 . 任意一个字符,不匹配空行
匹配文件除空行外的任意字符
[root@k8s-node01 ~]# cat a.txt
I
love
linux
[root@k8s-node01 ~]# grep '.' a.txt
I
love
linux
查找包含 'l' 后面跟随任何字符(除换行符外)的文本行
[root@k8s-node01 ~]# cat a.txt
I
love
linux
[root@k8s-node01 ~]# grep 'l.' a.txt
love
linux
5、\撬棍 转义字符 脱掉马甲打回原形,去掉特殊符号的含义
找出文件中以.(点)结尾的行
[root@k8s-node01 ~]# cat a.txt
I
love
linux.
[root@k8s-node01 ~]# grep '\.$' a.txt
linux.
6、* 前一个字符连续出现0次或0次以上
在文本文件 a.txt 中查找包含 'l' 后面跟随任何字符(除换行符外)的文本行
[root@k8s-node01 ~]# cat a.txt
I
love
linux.
[root@k8s-node01 ~]# grep 'l*' a.txt
I
love
linux.
在文本文件 a.txt 中查找包含字符 'l' 零次或多次重复的文本
[root@k8s-node01 ~]# cat a.txt
I
love
linux.
[root@k8s-node01 ~]# grep -o 'l*' a.txt
l
l
7、.* 所有,任何字符
以任意内容开头直到匹配到ov字符的行
[root@k8s-node01 ~]# cat a.txt
I
love
linux.
[root@k8s-node01 ~]# grep '^.*ov' a.txt
love
8、[] [abc] 表示匹配任意1个字符,a或b或c,中括号 相当于一个字符
匹配[efg]任意一个字符
[root@k8s-node01 ~]# cat a.txt
I
love
linux.
[root@k8s-node01 ~]# grep '[efg]' a.txt
love
匹配小写字母
[root@k8s-node01 ~]# cat a.txt
I
love
linux.
[root@k8s-node01 ~]# grep '[a-z]' a.txt
love
linux.
匹配大写字母
[root@k8s-node01 ~]# cat a.txt
I
love
linux.
[root@k8s-node01 ~]# grep '[A-Z]' a.txt
I
匹配大小写字母
[root@k8s-node01 ~]# cat a.txt
I
love
linux.
[root@k8s-node01 ~]# grep '[a-zA-Z]' a.txt
I
love
linux.
匹配数字
[root@k8s-node01 ~]# grep '[0-9]' a.txt
匹配大小写字母+数字
[root@k8s-node01 ~]# grep '[a-zA-Z0-9]' a.txt
匹配出以字母l或f开头的行
[root@k8s-node01 ~]# cat a.txt
I
love
linux.
[root@k8s-node01 ~]# grep '^[lf]' a.txt
love
linux.
匹配出以.或空格或!结尾的行
[root@k8s-node01 ~]# cat a.txt
I
love
linux.
[root@k8s-node01 ~]# grep '[.!]$' a.txt
linux.
9、[^] [^abc] 表示匹配任意1个字符,排除abc,中 括号相当于一个字符
[root@k8s-node01 ~]# cat a.txt
I
love
linux.
[root@k8s-node01 ~]# grep '[^abc]' a.txt
I
love
linux.
3.3.2 扩展正则¶
| 扩展正则 | 含义 |
|---|---|
| + | 前一个字符连续出现1次或多次 |
| | | 或者 |
| () | 表示整体; 后向引用或反向引用(sed) |
| {} | a{n,m}前一个字符连续出现至少n次,最多m次 |
| ? | 前一个字符出现0次或1次 |
1、+ 前一个字符连续出现1次或1次以上
取出连续出现的0
[root@k8s-node01 ~]# cat a.txt
I
00001111
love
linux.
1231323242423231
#方法一
[root@k8s-node01 ~]# egrep '0+' a.txt
00001111
#方法二
[root@k8s-node01 ~]# grep -E '0+' a.txt
00001111
#方法三
[root@k8s-node01 ~]# grep '0\+' a.txt
00001111
取出连续出现的数字
[root@k8s-node01 ~]# cat a.txt
I
00001111
love
linux.
1231323242423231
[root@k8s-node01 ~]# egrep '[0-9]+' a.txt
00001111
1231323242423231
取出连续出现的字母(单词)
[root@k8s-node01 ~]# cat a.txt
I
00001111
love
linux.
1231323242423231
[root@k8s-node01 ~]# egrep '[a-Z]' a.txt
I
love
linux.
2、 | 或者
文件中包含aaa或linux的行
[root@k8s-node01 ~]# cat a.txt
I
00001111
love
linux.
1231323242423231
[root@k8s-node01 ~]# egrep 'aaa|linux' a.txt
linux.
在/etc/services过滤出包含ssh或http或smtp的行
[root@k8s-node01 ~]# egrep 'ssh|http|smtp' /etc/services
# http://www.iana.org/assignments/port-numbers
ssh 22/tcp # The Secure Shell (SSH) Protocol
ssh 22/udp # The Secure Shell (SSH) Protocol
smtp 25/tcp mail
smtp 25/udp mail
http 80/tcp www www-http # WorldWideWeb HTTP
http 80/udp www www-http # HyperText Transfer Protocol
http 80/sctp # HyperText Transfer Protocol
https 443/tcp # http protocol over TLS/SSL
https 443/udp # http protocol over TLS/SSL
https 443/sctp # http protocol over TLS/SSL
gss-http 488/tcp
gss-http 488/udp
...
...
...
排除/etc/ssh/sshd_config中的空行或注释,输出的时候显示行号
[root@k8s-node01 ~]# egrep -vn '^$|^#' /etc/ssh/sshd_config
22:HostKey /etc/ssh/ssh_host_rsa_key
24:HostKey /etc/ssh/ssh_host_ecdsa_key
25:HostKey /etc/ssh/ssh_host_ed25519_key
32:SyslogFacility AUTHPRIV
47:AuthorizedKeysFile .ssh/authorized_keys
65:PasswordAuthentication yes
69:ChallengeResponseAuthentication no
79:GSSAPIAuthentication yes
80:GSSAPICleanupCredentials no
96:UsePAM yes
101:X11Forwarding yes
126:AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
127:AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
128:AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
129:AcceptEnv XMODIFIERS
132:Subsystem sftp /usr/libexec/openssh/sftp-server
3、() 表示一个整体,用于后向引用(反向引用sed)
检查系统中tree,vim,sl软件是否安装
# 方法一
[root@k8s-node01 ~]# rpm -qa | egrep '^tree|^vim|^sl'
slang-2.2.4-11.el7.x86_64
vim-minimal-7.4.629-7.el7.x86_64
# 方法二
[root@k8s-node01 ~]# rpm -qa | egrep '^(tree|vim|sl)'
slang-2.2.4-11.el7.x86_64
vim-minimal-7.4.629-7.el7.x86_64
# 方法三
[root@k8s-node01 ~]# rpm -qa | egrep 'tree|vim|sl'
xmlsec1-openssl-1.2.20-7.el7_4.x86_64
libxslt-1.1.28-6.el7.x86_64
python-slip-dbus-0.4.0-4.el7.noarch
slang-2.2.4-11.el7.x86_64
cyrus-sasl-lib-2.1.26-23.el7.x86_64
openssl-1.0.2k-19.el7.x86_64
vim-minimal-7.4.629-7.el7.x86_64
openssl-libs-1.0.2k-19.el7.x86_64
rsyslog-8.24.0-55.el7.x86_64
openssl098e-0.9.8e-29.el7.centos.3.x86_64
python-slip-0.4.0-4.el7.noarch
4、{} a{n,m} 前一个字符连续出现至少n次,最多m次
| 格式 | 应用 |
|---|---|
| a{n,m}前一个字符连续出现至少n次,最多m次 | 表示连续出现的范围 |
| a{n}前一个字符连续出现n次 (常用) | 匹配固定的次数 |
| a{n,} 前一个字符连续出现至少n次 | |
| a{,m} 前一个字符连续出现,最多m次 |
匹配字符0连续出现至少1次,最多4次
[root@k8s-node01 ~]# cat a.txt
I
00001111
love
linux.
1231323242423231
[root@k8s-node01 ~]# egrep '0{1,4}' a.txt
00001111
匹配连续出现4次0的行
[root@k8s-node01 ~]# cat a.txt
I
00001111
love
linux.
1231323242423231
[root@k8s-node01 ~]# egrep '0{4}' a.txt
00001111
匹配至少连续出现4次0的行
[root@k8s-node01 ~]# cat a.txt
I
00001111
love
linux.
1231323242423231
[root@k8s-node01 ~]# egrep '0{4,}' a.txt
00001111
匹配最多连续出现4次0的行
[root@k8s-node01 ~]# cat a.txt
I
00001111
love
linux.
1231323242423231
[root@k8s-node01 ~]# egrep '0{,4}' a.txt
I
00001111
love
linux.
1231323242423231
匹配身份证的正则
[root@k8s-node01 ~]# cat id.txt
140225200010102222
[root@k8s-node01 ~]# egrep '[0-9]{17}[0-9X]$' id.txt
140225200010102222
5、? 前一个字符 出现0次或1次
查找包含 'o' 的单词,其中 'o' 前面可以有零个或一个 'l' 字符
[root@k8s-node01 ~]# egrep 'l?o' a.txt
love
3.3.3 perl语言正则¶
| 符号 | 含义 |
|---|---|
| \d | [0-9] |
| \s | 匹配的空字符 空格 tab 等等 [\ \t\r\n\f] \n表示回车 |
| \w | [0-9a-zA-Z_] |
| \D | [^0-9] 排除数字 |
| \S | 非空字符 |
| \W | 排除数字,大小写字母和_ |
匹配数字
[root@k8s-node01 ~]# cat a.txt
I
00001111
love
linux.
1231323242423231
[root@k8s-node01 ~]# grep -P '\d' a.txt
00001111
1231323242423231
四、文本三剑客¶
4.1 sed¶
4.1.1 概述¶
取行,过滤,替换修改文件内容
4.1.2 格式¶
| 命令 | 选项 | 详细格式 | 参数 |
|---|---|---|---|
| sed | 选项 | 条件动作 | 文件 |
其中命令选项如下:
| 选项 | 说明 |
|---|---|
| -n | 取消默认输出(默认输出会输出文件全部内容) |
| -r | sed支持扩展正则 |
| -i | 修改文件内容(直接修改),这个选项放在最后 |
| -i.bak | 先进行备份,然后修改文件内容,这个选项放在最后 |
4.1.3 操作实例¶
查找
1、取出文件的第3行
$ sed -n '3p' /etc/passwd
2、取出/etc/passwd的第2行到第5行
$ sed -n '2,5p' /etc/passwd
3、 过滤出/etc/passwd中包含root的行
$ sed -n '/root/p' /etc/passwd
4、获取范围内(包含102所在行到包含105所在行)的日志(以行为单位)
$ sed -n '/102/ , /105/p' a.txt
5、只显示第3行和第5行
$ sed -n '1p;5p' /etc/passwd
6、打印序列中的奇数行
$ seq 10 |sed -n '1~2p'
也可以打印序列中的偶数行
$ seq 10 |sed -n '2~2p'
修改基础
1、把a.txt文件中I替换为i(不备份直接改)
[root@k8s-node01 ~]# cat a.txt
I
00001111
love
linux.
1231323242423231
[root@k8s-node01 ~]# sed -i s/I/i/g a.txt
[root@k8s-node01 ~]# cat a.txt
i
00001111
love
linux.
1231323242423231
2、把a.txt文件中I替换为i(先备份再改)
[root@k8s-node01 ~]# cat a.txt
I
00001111
love
linux.
1231323242423231
[root@k8s-node01 ~]# sed -i.bak s/I/i/g a.txt
[root@k8s-node01 ~]# cat a.txt
i
00001111
love
linux.
1231323242423231
[root@k8s-node01 ~]# ls *.bak
a.txt.bak
3、输出12345678,通过sed加工变成1<234567>8
[root@k8s-node01 ~]# echo 12345678 |sed -r 's#(1)(.*)(8)#\1<\2>\3#g'
1<234567>8
4、调换/etc/passwd第1列和最后一列内容
[root@k8s-node01 ~]# cp /etc/passwd .
[root@k8s-node01 ~]# sed -r 's#^(.*)(:x.*:)(.*$)#\3\2\1#g' passwd
5、取出网卡ip地址
# 方法一
[root@k8s-node01 ~]# ip a s ens33 | sed -n '3p' | sed -r 's#^.*et ([0-9.]+)/.*$#\1#g'
192.168.1.42
# 方法二
[root@k8s-node01 ~]# ip a s ens33 | sed -rn '3 s#^.*et ([0-9.]+)/.*$#\1#g p'
192.168.1.42
# 方法三
[root@k8s-node01 ~]# ip a s ens33 | sed -n '3p' | awk '{print $2}' | sed 's#/24##g'
192.168.1.42
# 方法四
[root@k8s-node01 ~]# ip a s ens33 | sed -n '3p' | awk -F "[ /]+" '{print $3}'
192.168.1.42
# 方法五
[root@k8s-node01 ~]# ip a s ens33 | sed -n '3p' | awk -F "[ /]+" 'NR=3{print $3}'
192.168.1.42
# 方法六
[root@k8s-node01 ~]# ip a s ens33 | awk 'NR==3' | awk -F "[ /]+" '{print $3}'
192.168.1.42
# 方法七
[root@k8s-node01 ~]# hostname -I | awk {print$1}
192.168.1.42
6、取出stat /etc/hosts中的0644或644
[root@k8s-node01 ~]# stat /etc/hosts | sed -n '4p' | sed -r 's#^.*\(([0-9]+)/.*$#\1#g'
0644
删除
1、删除文件第三行
$ sed '3d' sed.txt
2、删除文件中的空行和带注释的行
# 方法一
$ egrep -v '^$|#' /etc/ssh/sshd_config
# 方法二
$ sed -r '/^$|#/d' /etc/ssh/sshd_config
3、排除文件中的空行和带注释的行
# 方法一
$ awk '! /^$|#/' /etc/ssh/sshd_config
# 方法二
$ sed -nr '/^$|#/!p' /etc/ssh/sshd_config
增加
其中命令选项如下:
| 选项 | 说明 |
|---|---|
| -a | 在指定行后面追加内容 |
| -i | 在指定行上面插入一行 |
| -c | 替换指定行内容 |
1、在文件a.txt的第三行后面添加123456(不会实际修改,只是预览)
[root@k8s-node01 ~]# sed '3a 123456' a.txt
i
00001111
love
123456
linux.
1231323242423231
2、在文件a.txt的第三行上面插入一行123456(不会实际修改,只是预览)
[root@k8s-node01 ~]# sed '3i 123456' a.txt
i
00001111
123456
love
linux.
1231323242423231
3、替换文件a.txt的第三行内容为123456
[root@k8s-node01 ~]# sed '3c 123456' a.txt
i
00001111
123456
linux.
1231323242423231
4.2 awk¶
4.2.1 概述¶
awk 是一个强大的文本处理工具,常常用于在Unix/Linux系统中进行文本数据的分析和处理。它的主要功能包括从文本文件、标准输入或管道中提取、转换和格式化数据。
4.2.2 格式¶
| 命令 | 选项 | 详细格式 | 参数 |
|---|---|---|---|
| awk | 选项 | 条件动作 | 文件 |
取出/etc/passwd中的第1行的第1列,第3列和最后一列
[root@k8s-node01 ~]# awk -F: 'NR=1{print $1,$3,$NF}' /etc/passwd
root 0 /bin/bash
bin 1 /sbin/nologin
daemon 2 /sbin/nologin
adm 3 /sbin/nologin
lp 4 /sbin/nologin
sync 5 /bin/sync
shutdown 6 /sbin/shutdown
halt 7 /sbin/halt
mail 8 /sbin/nologin
operator 11 /sbin/nologin
games 12 /sbin/nologin
ftp 14 /sbin/nologin
nobody 99 /sbin/nologin
systemd-network 192 /sbin/nologin
dbus 81 /sbin/nologin
polkitd 999 /sbin/nologin
tss 59 /sbin/nologin
abrt 173 /sbin/nologin
sshd 74 /sbin/nologin
postfix 89 /sbin/nologin
zq 1000 /bin/bash
mysql 1001 /bin/bash
4.2.3 操作实例¶
取行操作
1、取出/etc/passwd的第 1行
[root@k8s-node01 ~]# awk 'NR==1{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@k8s-node01 ~]# awk 'NR==1' /etc/passwd
root:x:0:0:root:/root:/bin/bash
2、取出第2行到第5行的内容
[root@k8s-node01 ~]# awk 'NR>=2 && NR <=5' /etc/passwd
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
awk支持运算符,可以进行计算,进行对比
| awk常用运算符 | 说明 |
|---|---|
| == | 等于 |
| != | 不等于 |
| > | 大于 |
| >= | 大于等于 |
| < | 小于 |
| <= | 小于等于 |
| && | 并且 |
| || | 或者 |
3、过滤出/etc/passwd文件 中包含root或nobody的行
[root@k8s-node01 ~]# awk '/root|nobody/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
4、从包含root的行到包含nobody的行
[root@k8s-node01 ~]# awk '/root/,/nobody/' /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
取列操作
1、使用awk取出ls -lh的 大小列和最后一列
# 方法一
[root@k8s-node01 ~]# ls -lh /etc/hosts | awk '{print $5,$9}'
208 /etc/hosts
# 方法二
[root@k8s-node01 ~]# ls -lh /etc/hosts | awk '{print $5,$NF}'
208 /etc/hosts
如果想awk输出对齐,可以采用column命令或者\t命令
# 方法一
[root@k8s-node01 ~]# ls -lh /etc/hosts | awk '{print $5,$NF}' | column -t
208 /etc/hosts
# 方法二
[root@k8s-node01 ~]# ls -lh /etc/hosts | awk '{print $5"\t"$NF}'
208 /etc/hosts
2、取出/etc/passwd中的第 1列,第3列和最后一列
[root@k8s-node01 ~]# awk -F ':' '{print $1,$3,$NF}' /etc/passwd|column -t
root 0 /bin/bash
bin 1 /sbin/nologin
daemon 2 /sbin/nologin
adm 3 /sbin/nologin
lp 4 /sbin/nologin
sync 5 /bin/sync
shutdown 6 /sbin/shutdown
halt 7 /sbin/halt
mail 8 /sbin/nologin
operator 11 /sbin/nologin
games 12 /sbin/nologin
ftp 14 /sbin/nologin
nobody 99 /sbin/nologin
systemd-network 192 /sbin/nologin
dbus 81 /sbin/nologin
polkitd 999 /sbin/nologin
tss 59 /sbin/nologin
abrt 173 /sbin/nologin
sshd 74 /sbin/nologin
postfix 89 /sbin/nologin
zq 1000 /bin/bash
mysql 1001 /bin/bash
3、指定复杂分隔符取出ip
# 方法一
[root@k8s-node01 ~]# ip a s ens33 |awk 'NR==3' | awk '{print $2}' | awk -F '/' '{print $1}'
192.168.1.42
# 方法二
[root@k8s-node01 ~]# ip a s ens33 |awk 'NR==3' | awk -F 'inet |/24' '{print $2}'
192.168.1.42
取行与取列操作
1、取ip地址(取行+取列)
[root@k8s-node01 ~]# ip a s ens33 |awk -F '[ /]+' 'NR==3{print $3}'
192.168.1.42
2、取出权限部分 stat /etc/hosts的0644部分
# 方法一
[root@k8s-node01 ~]# stat /etc/hosts | awk -F '[^0-9]+' 'NR==4{print $2}'
0644
# 方法二
[root@k8s-node01 ~]# stat /etc/hosts | awk -F '[/(]' 'NR==4{print $2}'
0644
3、取出/etc/passwd文件中 第3列大于等于100的行,取出这行的第1列,第3列和最后 一列
[root@k8s-node01 ~]# awk -F':' '$3>=100{print $1,$3,$NF}' /etc/passwd | column -t
systemd-network 192 /sbin/nologin
polkitd 999 /sbin/nologin
abrt 173 /sbin/nologin
zq 1000 /bin/bash
mysql 1001 /bin/bash
4、如果系统swap使用超过0则输出"异常 系统开始占用swap"
# 方法一
[root@k8s-node01 ~]# free | awk '/Swap/ && $3 >0 {print "异常系统开始占用swap"}'
# 方法二
[root@k8s-node01 ~]# free | awk 'NR==3 && $3 >0 {print "异常系统开始占用swap"}'
5、过滤出/etc/passwd第4 列的数字是以0或1开头的行,输出第1列,第3列,第4列
[root@k8s-node01 ~]# awk -F ':' '$4 ~ /^[01]/ {print $1,$3,$4}' /etc/passwd | column -t
root 0 0
bin 1 1
sync 5 0
shutdown 6 0
halt 7 0
mail 8 12
operator 11 0
games 12 100
systemd-network 192 192
abrt 173 173
zq 1000 1000
mysql 1001 1001
统计与计算操作
1、统计/etc/passwd文件行数
[root@k8s-node01 ~]# awk '{i++} END{print i}' /etc/passwd
22
2、计算总和
[root@k8s-node01 ~]# seq 10 > num.txt
[root@k8s-node01 ~]# awk '{i=i+$1}END{print i}' num.txt
55
4.3 grep¶
4.3.1 概述¶
4.3.2 格式¶
grep命令常用用法
| grep命令选项 | 命令说明 |
|---|---|
| grep -n | 查看内容时显示行号 |
| grep -v | 排除,取反 |
| grep -i | 不区分大小写 |
4.3.3 操作实例¶
1、在/etc/passwd中过滤出包含root的行
$ grep 'root' /etc/passwd
2、在/etc/passwd中过滤出包含root的行且显示行号
$ grep -n 'root' /etc/passwd
3、在/etc/passwd中过滤出包含network的行不区分大小写
$ grep -i 'network' /etc/passwd
4、在/etc/passwd中过滤出排除network的行
$ grep -v 'network' /etc/passwd