目录
一:正则表达式
1.1:概述
正则表达式又称正规表达式、常规表达式。在代码中常简写为
regex
、
regexp
或
RE
。正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,简单来说,是一种匹配字符串的方法,通过一些特殊符号,实现快速查找、删除、替换某个特定字符串。
正则表达式是由普通字符与元字符组成的文字模式。模式用于描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。其中普通字符包括大小写字母、数字、标点符号及一些其他符号,元字符则是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
正则表达式一般用于脚本编程与文本编辑器中。很多文本处理器与程序设计语言均支持正则表达式,例如 Linux
系统中常见的文本处理器(
grep
、
egrep
、
sed
、
awk
)以及应用比较广泛的 Python
语言。正则表达式具备很强大的文本匹配功能,能够在文本海洋中快速高效地处理文本。
1.2:基础正则表达式
正则表达式的字符串表达方法根据不同的严谨程度与功能分为基本正则表达式与扩展正则表达式。基础正则表达式是常用正则表达式最基础的部分。在 Linux
系统中常见的文件处理工具中 grep
与
sed
支持基础正则表达式,而
egrep
与
awk
支持扩展正则表达式。
1.2.1:基础正则表达式实例
(1):查找特定字符
执行以下命令即可从
test.txt
文件中查找出特定字符
“the”
所在位置。其中“-n”
表示显示行号、
“-i”
表示不区分大小写。命令执行后,符合匹配标准的字符,字体颜色会变为红色
[root@localhost ~]# grep -n 'the' test.txt[root@localhost ~]# grep -in 'the' test.txt
若反向选择,如查找不包含
“the”
字符的行,则需要通过
grep
命令的
“-v”
选项实现,并配合“-n”
一起使用显示行号
[root@localhost ~]# grep -vn 'the' test.txt
(2):利用中括号 “[ ]”来查找集合字符
想要查找
“shirt”
与
“short”
这两个字符串时,可以发现这两个字符串均包含
“sh”
与
“rt”
。此时执行以下命令即可同时查找到“shirt”
与
“short”
这两个字符串,其中
“[]”
中无论有几个字符,都仅代表一个字符,也就是说“[io]”
表示匹配
“i”
或者
“o”
[root@localhost ~]# grep -n 'sh[io]rt' test.txt
若要查找包含重复单个字符“oo”时,只需要执行以下命令即可。
[root@localhost ~]# grep -n 'oo' test.txt
若查找
“oo”
前面不是
“w”
的字符串,只需要通过集合字符的反向选择
“[^]”
来实现该目的。例如执行“grep -n‘[^w]oo’test.txt”
命令表示在
test.txt
文本中查找
“oo”
前面不是
“w”
的字符串。
[root@localhost ~]# grep -n '[^w]oo' test.txt
若不希望“oo”前面存在小写字母,可以使用“grep -n‘[^a-z]oo’test.txt”命令实现,其中“a-z”表示小写字母,大写字母则通过“A-Z”表示
[root@localhost ~]# grep -n '[^a-z]oo' test.txt
查找包含数字的行可以通过“grep -n‘[0-9]’test.txt”命令来实现。
[root@localhost ~]# grep -n '[0-9]' test.txt
(3)查找行首“^”与行尾字符“$”
基础正则表达式包含两个定位元字符:
“^”
(行首)与
“$”
(行尾)。在上面的示例中,查询“the”
字符串时出现了很多包含
“the”
的行,如果想要查询以
“the”
字符串为行首的行,则可以通过“^”
元字符来实现。
[root@localhost ~]# grep -n '^the' test.txt
查询以小写字母开头的行可以通过
“^[a-z]”
规则来过滤,查询大写字母开头的行则使用“^[A-Z]”规则,若查询不以字母开头的行则使用
“^[^a-zA-Z]”
规则
[root@localhost ~]# grep -n '^[a-z]' test.txt[root@localhost ~]# grep -n '^[A-Z]' test.txt[root@localhost ~]# grep -n '^[^a-zA-Z]' test.txt
“^”
符号在元字符集合
“[]”
符号内外的作用是不一样的,在
“[]”
符号内表示反向选择,在
“[]” 符号外则代表定位行首。反之,若想查找以某一特定字符结尾的行则可以使用“$”
定位符
当查询空白行时,执行
“grep -n‘^$’test.txt”
命令即可。
(4)查找任意一个字符“.”与重复字符“*”
在正则表达式中小数点(
.
)也是一个元字符,代表任意一个字符。例如执行以下命令就可以查找“w??d”
的字符串,即共有四个字符,以
w
开头
d
结尾。
[root@localhost ~]# grep -n 'w..d' test.txt
“*”
代表的是重复零个或多个前面的单字符。
“o*”
表示拥有零个(即为空字符)或大于等于一个
“o”
的字符,因为允许空字符,所以执行
“grep -n 'o*' test.txt”命令会将文本中所有的内容都输出打印。如果是
“oo*”
,则第一个
o
必须存在,第二个 o
则是零个或多个
o
,所以凡是包含
o
、
oo
、
ooo
、
ooo
,等的资料都符合标准
查询以
w
开头
d
结尾,中间包含至少一个
o
的字符串,执行以下命令即可实现。
[root@localhost ~]# grep -n 'woo*d' test.txt
执行以下命令即可查询以 w 开头 d 结尾,中间的字符可有可无的字符串
[root@localhost ~]# grep -n 'w.*d' test.txt
执行以下命令即可查询任意数字所在行
[root@localhost ~]# grep -n '[0-9][0-9]*' test.txt
(5)查找连续字符范围“{}”
查找三到五个
o
的连续字符,这个时候就需要使用基础正则表达式中的限定范围的字符“{}”
。因为
“{}”
在
Shell
中具有特殊意义,所以在使用“{}”
字符时,需要利用转义字符
“\”
,将
“{}”
字符转换成普通字符。
“{}”
字符的使用方法如下所示。
①
查询两个
o
的字符
[root@localhost ~]# grep -n 'o\{2\}' test.txt
② 查询以 w 开头以 d 结尾,中间包含 2~5 个 o 的字符串
[root@localhost ~]# grep -n 'wo\{2,5\}d' test.txt
③ 查询以 w 开头以 d 结尾,中间包含 2 个或 2 个以上 o 的字符串
[root@localhost ~]# grep -n 'wo\{2,\}d' test.txt
1.2.2:元字符总结
元字符 | 作用 |
---|---|
^ |
匹配输入字符串的开始位置。除非在方括号表达式中使用,表示不包含该字符集合。要匹配
“^” 字符本身,请使用“\^”
|
$
|
匹配输入字符串的结尾位置。如果设置了
RegExp
对象的
Multiline
属性,则
“$”
也匹配
‘\n’
或
‘\r’
。要匹配“$”
字符本身,请使用
“\$”
|
. |
匹配除
“\r\n”
之外的任何单个字符
|
\ |
反斜杠,又叫转义字符,去除其后紧跟的元字符或通配符的特殊意义
|
* |
匹配前面的子表达式零次或多次。要匹配
“*”
字符,请使用
“\*”
|
[ ] |
字符集合。匹配所包含的任意一个字符。例如,
“[abc]”
可以匹配
“plain”
中的
“a”
|
[^]
|
赋值字符集合。匹配未包含的一个任意字符。例如,
“[^abc]”
可以匹配
“plain”
中任何一个字母
|
[n1-n2]
|
字符范围。匹配指定范围内的任意一个字符。例如,
“[a-z]”
可以匹配
“a”
到
“z”
范围内的任意一个小写字母字符。
注意:只有连字符(
-
)在字符组内部,并且出现在两个字符之间时,才能表示字符的范围;如果出现在字符组的开头,则只能表示连字符本身
|
{n}
|
n
是一个非负整数,匹配确定的
n
次。例如,
“o{2}”
不能匹配
“Bob”
中的
“o”
,但是能匹配
“food”
中的“oo“
|
{n,}
|
n
是一个非负整数,至少匹配
n
次。例如,
“o{2,}”
不能匹配
“Bob”
中的
“o”
,但能匹配
“foooood”
中的所有 o
。
“o{1,}”
等价于
“o+”
。
“o{0,}”
则等价于
“o*”
|
{n,m}
|
m
和
n
均为非负整数,其中
n<=m
,最少匹配
n
次且最多匹配
m
次
|
1.3:扩展正则表达式
grep
命令仅支持基础正则表达式,如果使用扩展正则表达式,需要使用
egrep 或 awk 命令。
egrep
命令是一个搜索文件获得模式,使用该命令可以搜索文件中的任意字符串和符号,也可以搜索一个或多个文件的字符串,一个提示符可以是单个字符、一个字符串、一个字或一个句子。
元字符 | 作用与示例 |
---|---|
+ |
作用:重复一个或者一个以上的前一个字符
示例:执行
“egrep -n 'wo+d' test.txt”
命令,即可查询
"wood" "woood" "woooooood"
等字符串
|
? |
作用:零个或者一个的前一个字符
示例:执行
“egrep -n 'bes?t' test.txt”
命令,即可查询
“bet”“best”
这两个字符串
|
| |
作用:使用或者(
or
)的方式找出多个字符
示例:执行
“egrep -n 'of|is|on' test.txt”
命令即可查询
"of"
或者
"if"
或者
"on"
字符串
|
() |
作用:查找
“
组
”
字符串
示例:
“egrep -n 't(a|e)st' test.txt”
。
“tast”
与
“test”
因为这两个单词的
“t”
与
“st”
是重复的,所以将
“a”
与
“e”
列于
“()”
符号当中,并以
“|”
分隔,即可查询
"tast"
或者
"test"
字符串
|
()+ |
作用:辨别多个重复的组
示例:
“egrep -n 'A(xyz)+C' test.txt”
。该命令是查询开头的
"A"
结尾是
"C"
,中间有一个以上的
"xyz"
字
符串的意思
|
二:文本处理器
2.1:sed工具
sed
(
Stream EDitor
)是一个强大而简单的文本解析转换工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除、替换、添加、移动等),最后输出所有行或者仅输出处理的某些行。sed
也可以在无交互的情况下实现相当复杂的文本处理操作,被广泛应用于 Shell
脚本中,用以完成各种自动化处理任务
sed
的工作流程主要包括读取、执行和显示三个过程
- 读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。
- 执行:默认情况下,所有的 sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则 sed 命令将会在所有的行上依次执行。
- 显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空
在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
注意:默认情况下所有的
sed
命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出
1:sed命令常用方法
通常情况下调用
sed
命令有两种格式,如下所示。其中,
“
参数
”
是指操作的目标文件,当存在多个操作对象时用,文件之间用逗号“
,
”
分隔;而
scriptfile
表示脚本文件,需要用
“-f” 选项指定,当脚本文件出现在目标文件之前时,表示通过指定的脚本文件来处理输入的目标文件。
sed [ 选项 ] ' 操作 ' 参数sed [ 选项 ] -f scriptfile 参数
常见的
sed
命令选项主要包含以下几种
- -e 或--expression=:表示用指定命令或者脚本来处理输入的文本文件。
- -f 或--file=:表示用指定的脚本文件来处理输入的文本文件。
- -h 或--help:显示帮助。
- -n、--quiet 或 silent:表示仅显示处理后的结果。
- -i:直接编辑文本文件。
“
操作
”
用于指定对文件操作的动作行为,也就是
sed
的命令。通常情况下是采用的“[n1[,n2]]”操作参数的格式。
n1
、
n2
是可选的,代表选择进行操作的行数,如操作需要在
5
~ 20 行之间进行,则表示为
“5
,
20
动作行为
”
。常见的操作包括以下几种
- a:增加,在当前行下面增加一行指定内容。
- c:替换,将选定行替换为指定内容。
- d:删除,删除选定的行。
- i:插入,在选定行上面插入一行指定内容。
- p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以 ASCII 码输出。其通常与“-n”选项一起使用。
- s:替换,替换指定字符。
- y:字符转换。
2:用法示例
(1)输出符合条件的文本(p 表示正常输出)
[root@localhost ~]# sed -n 'p' test.txt // 输出所有内容 , 等同于 cat test.txt[root@localhost ~]# sed -n '3p' test.txt //输出第 3 行[root@localhost ~]# sed -n '3,5p' test.txt //输出 3~5 行[root@localhost ~]# sed -n 'p;n' test.txt //输出所有奇数行 ,n 表示读入下一行资料[root@localhost ~]# sed -n 'n;p' test.txt //输出所有偶数行 ,n 表示读入下一行资料[root@localhost ~]# sed -n '1,5{p;n}' test.txt // 输出第 1~5 行之间的奇数行 ( 第 1 、 3 、 5 行 )[root@localhost ~]# sed -n '10,${n;p}' test.txt //输出第 10 行至文件尾之间的偶数行
在执行
“sed -n‘10,${n;p}’test.txt”
命令时,读取的第
1
行是文件的第
10
行,读取的第
2 行是文件的第 11
行,依此类推,所以输出的偶数行是文件的第
11
行、
13
行直至文件结尾,其中包括空行。
以上是
sed
命令的基本用法,
sed
命令结合正则表达式时,格式略有不同,正则表达式以“/”
包围。例如,以下操作是
sed
命令与正则表达式结合使用的示例。
[root@localhost ~]# sed -n '/the/p' test.txt //输出包含 the 的行[root@localhost ~]# sed -n '4,/the/p' test.txt //输出从第 4 行至第一个包含 the 的行[root@localhost ~]# sed -n '/the/=' test.txt //输出包含 the 的行所在的行号 , 等号 (=) 用来输出行号[root@localhost ~]# sed -n '/^PI/p' test.txt //输出以 PI 开头的行[root@localhost ~]# sed -n '/[0-9]$/p' test.txt //输出以数字结尾的行[root@localhost ~]# sed -n '/\<wood\>/p' test.txt //输出包含单词 wood 的行 ,\< 、 \> 代表单词边界
(2)删除符合条件的文本(d)
nl
命令用于计算文件的行数,结合该命令可以更加直观地查看到命令执行的结果。
[root@localhost ~]# nl test.txt | sed '3d' //删除第 3 行[root@localhost ~]# nl test.txt | sed '3,5d' //删除第 3~5 行[root@localhost ~]# nl test.txt |sed '/cross/d' //删除包含 cross 的行 , 原本的第 8 行被删除;如果要删除不包含 cross 的行 , 用 ! 符号表示取反操作 , 如'/cross/ ! d'[root@localhost ~]# sed '/^[a-z]/d' test.txt //删除以小写字母开头的行[root@localhost ~]# sed '/\.$/d' test.txt //删除以 "." 结尾的行[root@localhost ~]# sed '/^$/d' test.txt //删除所有空行
注 意 : 若 是 删 除 重 复 的 空 行 , 即 连 续 的 空 行 只 保 留 一 个 , 执 行
“sed -e‘/^$/{n;/^$/d}’test.txt”命令即可实现。其效果与
“cat -s test.txt”
相同,
n
表示读下一行数据。
(3)替换符合条件的文本
在使用
sed
命令进行替换操作时需要用到
s
(字符串替换)、
c
(整行
/
整块替换)、
y (字符转换)命令选项,常见的用法如下所示。
sed 's/the/THE/' test.txt //将每行中的第一个 the 替换为 THEsed 's/l/L/2' test.txt //将每行中的第 2 个 l 替换为 Lsed 's/the/THE/g' test.txt //将文件中的所有 the 替换为 THEsed 's/o//g' test.txt //将文件中的所有 o 删除 ( 替换为空串 )sed 's/^/#/' test.txt //在每行行首插入 # 号sed '/the/s/^/#/' test.txt //在包含 the 的每行行首插入 # 号sed 's/$/EOF/' test.txt //在每行行尾插入字符串 EOFsed '3,5s/the/THE/g' test.txt //将第 3~5 行中的所有 the 替换为 THEsed '/the/s/o/O/g' test.txt //将包含 the 的所有行中的 o 都替换为 O
(4)迁移符合条件的文本
在使用
sed
命令迁移符合条件的文本时,常用到以下参数
.
- H:复制到剪贴板;
- g、G:将剪贴板中的数据覆盖/追加至指定行;
- w:保存为文件;
- r:读取指定文件;
- a:追加指定内容。
sed '/the/{H;d};$G' test.txt //将包含 the 的行迁移至文件末尾 ,{;} 用于多个操作sed '1,5{H;d};17G' test.txt //将第 1~5 行内容转移至第 17 行后sed '/the/w out.file' test.txt //将包含 the 的行另存为文件 out.filesed '/the/r /etc/hostname' test.txt //将文件 /etc/hostname 的内容添加到包含 the 的每行以后sed '3aNew' test.txt //在第 3 行后插入一个新行 , 内容为 Newsed '/the/aNew' test.txt //在包含 the 的每行后插入一个新行 , 内容为 Newsed '3aNew1\nNew2' test.txt //在第 3 行后插入多行内容 , 中间的 \n 表示换行
(5)sed 直接操作文件示例
编写一个脚本,用来调整
vsftpd
服务配置,要求禁止匿名用户,但允许本地用户(也允许写入)
[root@localhost ~]# vim local_only_ftp.sh#!/bin/bash# 指定样本文件路径、配置文件路径SAMPLE="/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.conf "CONFIG="/etc/vsftpd/vsftpd.conf"# 备份原来的配置文件 , 检测文件名为 /etc/vsftpd/vsftpd.conf.bak 备份文件是否存在 ,若不存在则使用 cp 命令进行文件备份[ ! -e "$CONFIG.bak" ] && cp $CONFIG $CONFIG.bak# 基于样本配置进行调整 , 覆盖现有文件sed -e '/^anonymous_enable/s/YES/NO/g' $SAMPLE > $CONFIGsed -i -e '/^local_enable/s/NO/YES/g' -e '/^write_enable/s/NO/YES/g' $CONFIGgrep "listen" $CONFIG || sed -i '$alisten=YES' $CONFIG# 启动 vsftpd 服务 , 并设为开机后自动运行systemctl restart vsftpdsystemctl enable vsftpd[root@localhost ~]# chmod +x local_only_ftp.sh
2.2:awk工具
在
Linux/UNIX
系统中,
awk
是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于 Shell
脚本,完成各种自动化配置任务。
2.2.1:awk常见用法
通常情况下
awk
所使用的命令格式如下所示,其中,单引号加上大括号
“{}”
用于设置对数据进行的处理动作。awk
可以直接处理目标文件,也可以通过
“-f”
读取脚本对目标文件进行处理
awk 选项 ' 模式或条件 { 编辑指令 }' 文件 1 文件 2 … // 过滤并输出文件中符合条件的内容awk -f 脚本文件 文件 1 文件 2 … //从脚本中调用编辑指令 , 过滤并输出内容
awk
比较倾向于将一行分成多个
“
字段
”
然后再进行处理,且默认情况下字段的分隔符为空格或 tab
键。
awk
执行结果可以通过
print
的功能将字段数据打印显示。在使用 awk
命令的过程中
,
可以使用逻辑操作符
“&&”
表示
“
与
”
、“||” 表示“
或
”
、
“
!
”
表示
“
非
”
;还可以进行简单的数学运算,如
+
、
-
、
*
、
/
、
%
、
^
分别表示加、减、乘、除、取余和乘方
在
Linux
系统中
/etc/passwd
是一个非常典型的格式化文件,各字段间使用
“
:
”
作为分隔符隔开,Linux
系统中的大部分日志文件也是格式化文件,从这些文件中提取相关信息是运维的日常工作内容之一。若需要查找出/etc/passwd
的用户名、用户
ID
、组
ID
等列,执行以下 awk
命令即可
[root@localhost ~]# awk -F ':' '{print $1,$3,$4}' /etc/passwdroot 0 0bin 1 1daemon 2 2……// 省略部分内容
awk
从输入文件或者标准输入中读入信息,与
sed
一样,信息的读入也是逐行读取的。不同的是 awk
将文本文件中的一行视为一个记录,而将一行中的某一部分(列)作为记录中的一个字段(域)。为了操作这些不同的字段,awk
借用
shell
中类似于位置变量的方法,用$1
、
$2
、
$3…
顺序地表示行(记录)中的不同字段。另外
awk
用
$0
表示整个行(记录)。
不同的字段之间是通过指定的字符分隔。
awk
默认的分隔符是空格。
awk
允许在命令行中用“-F
分隔符
”
的形式来指定分隔符。在上述示例中,
awk
命令对
/etc/passwd
文件的处理过程如下图
所示。
awk 包含几个特殊的内建变量(可直接用)如下所示:
- FS:指定每行文本的字段分隔符,默认为空格或制表位。
- NF:当前处理的行的字段个数。
- NR:当前处理的行的行号(序数)。
- $0:当前处理的行的整行内容。
- $n:当前处理行的第 n 个字段(第 n 列)。
- FILENAME:被处理的文件名。
- RS:数据记录分隔,默认为\n,即每行为一条记录。
2.2.2:示例
(1)按行输出文本
awk '{print}' test.txt //输出所有内容 , 等同于 cat test.txtawk '{print $0}' test.txt //输出所有内容 , 等同于 cat test.txtawk 'NR==1,NR==3{print}' test.txt //输出第 1~3 行内容awk '(NR>=1)&&(NR<=3){print}' test.txt //输出第 1~3 行内容awk 'NR==1||NR==3{print}' test.txt //输出第 1 行、第 3 行内容awk '(NR%2)==1{print}' test.txt //输出所有奇数行的内容awk '(NR%2)==0{print}' test.txt //输出所有偶数行的内容awk '/^root/{print}' /etc/passwd //输出以 root 开头的行awk '/nologin$/{print}' /etc/passwd //输出以 nologin 结尾的行awk 'BEGIN {x=0};/\/bin\/bash$/{x++};END {print x}' /etc/passwd// 统计以 /bin/bash 结尾的行数 , 等同于 grep -c "/bin/bash$" /etc/passwdawk 'BEGIN{RS=""};END{print NR}' /etc/squid/squid.conf// 统计以空行分隔的文本段落数
(2)按字段输出文本
awk '{print $3}' test.txt //输出每行中(以空格或制表位分隔)的第 3 个字段
awk '{print $1,$3}' test.txt //输出每行中的第 1 、 3 个字段awk -F ":" '$2==""{print}' /etc/shadow // 输出密码为空的用户的 shadow 记录awk 'BEGIN {FS=":"}; $2==""{print}' /etc/shadow //输出密码为空的用户的 shadow 记录awk -F ":" '$7~"/bash"{print $1}' /etc/passwd// 输出以冒号分隔且第 7 个字段中包含 /bash 的行的第 1 个字段awk '($1~"nfs")&&(NF==8){print $1,$2}' /etc/services// 输出包含 8 个字段且第 1 个字段中包含 nfs 的行的第 1 、 2 个字段awk -F ":" '($7!="/bin/bash")&&($7!="/sbin/nologin"){print}' /etc/passwd// 输出第 7 个字段既不为 /bin/bash 也不为 /sbin/nologin 的所有行
(3)通过管道、双引号调用 Shell 命令
awk -F: '/bash$/{print | "wc -l"}' /etc/passwd// 调用 wc -l 命令统计使用 bash 的用户个数 , 等同于 grep -c "bash$" /etc/passwdawk 'BEGIN {while ("w" | getline) n++ ; {print n-2}}' //调用 w 命令 , 并用来统计在线用户数awk 'BEGIN { "hostname" | getline ; print $0}' //调用 hostname, 并输出当前的主机名
2.3:sort工具
在
Linux
系统中,常用的文件排序工具有三种:
sort
、
uniq
、
wc
sort
是一个以行为单位对文件内容进行排序的工具,也可以根据不同的数据类型来排序。例如数据和字符的排序就不一样。sort
命令的语法为
“sort [
选项
]
参数
”
,其中常用的选项包括以下几种。
- -f:忽略大小写;
- -b:忽略每行前面的空格;
- -M:按照月份进行排序;
- -n:按照数字进行排序;
- -r:反向排序;
- -u:等同于 uniq,表示相同的数据仅显示一行;
- -t:指定分隔符,默认使用[Tab]键分隔;
- -o <输出文件>:将排序后的结果转存至指定文件;
- -k:指定排序区域。
2.4:uniq工具
Uniq
工具在
Linux
系统中通常与
sort
命令结合使用,用于报告或者忽略文件中的重复行。具体的命令语法格式为:uniq [
选项
]
参数。其中常用选项包括以下几种。
- -c:进行计数;
- -d:仅显示重复行;
- -u:仅显示出现一次的行。
示例:删除 testfile 文件中的重复行,并在行首显示该行重复出现的次数。
[root@localhost ~]# uniq -c testfile1 Linux 101 Linux 203 Linux 303 CentOS 6.53 CentOS 7.3
2.5:tr工具
tr
命令常用来对来自标准输入的字符进行替换、压缩和删除。可以将一组字符替换之后变成另一组字符,经常用来编写优美的单行命令,作用很强大。
tr
具体的命令语法格式为:
tr [ 选项 ] [ 参数 ]
其常用选项包括以下内容
- -c:取代所有不属于第一字符集的字符;
- -d:删除所有属于第一字符集的字符;
- -s:把连续重复的字符以单独一个字符表示;
- -t:先删除第一字符集较第二字符集多出的字符
示例
1
:将输入字符由大写转换为小写。
[root@localhost ~]# echo "WIND" | tr 'A-Z' 'a-z'wind
示例 2:压缩输入中重复的字符。
[root@localhost ~]# echo "thissss is a text linnnnnnne." | tr -s 'sn'this is a text line.
示例
3
:
删除字符串中某些字符
。
[root@localhost ~]# echo 'hello world' | tr -d 'od'hell wrl