一、前言

本文通过以下几个方面介绍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