文章目录
正则表达
在Linux系统中,正则表达式(Regular Expressions, 简称Regex)是一种强大的文本处理工具,它允许你定义一种搜索、替换或操作文本的模式。sed
、awk
和grep
是三个非常流行的命令行工具,它们能够利用正则表达式来执行复杂的文本处理任务。
1. 正则表达式(Regular Expressions)
正则表达式是一种特殊的字符串模式,用于匹配、搜索、替换文本中的字符或字符组合。它由普通字符(如字母a到z)和特殊字符(称为“元字符”)组成。特殊字符赋予正则表达式以搜索、匹配和替换的能力。
常用的正则表达式元字符:
正则表达式的元字符是指那些在正则表达式中具有特殊意义的专用字符,它们可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
1. 基本元字符
.
:匹配除换行符以外的任意单个字符。^
:匹配输入字符串的开始位置。如果设置了多行模式(re.MULTILINE
),则也匹配每一行的开始。$
:匹配输入字符串的结束位置。如果设置了多行模式,则也匹配每一行的结束。*
:匹配前面的子表达式零次或多次。+
:匹配前面的子表达式一次或多次。?
:匹配前面的子表达式零次或一次。{n}
:n 是一个非负整数。匹配确定的 n 次。{n,}
:n 是一个非负整数。至少匹配 n 次。{n,m}
:n 和 m 均为非负整数,其中 n <= m。匹配至少 n 次,但不超过 m 次。
2. 字符类元字符
[xyz]
:字符集合。匹配所包含的任意一个字符。[^xyz]
:负向字符集合。匹配未包含的任意字符。[a-z]
:字符范围。匹配指定范围内的任意字符。[^a-z]
:负向字符范围。匹配不在指定范围内的任意字符。
3. 特殊字符类
\d
:匹配一个数字字符。等价于[0-9]
。\D
:匹配一个非数字字符。等价于[^0-9]
。\s
:匹配任何空白字符,包括空格、制表符、换页符等。\S
:匹配任何非空白字符。\w
:匹配字母、数字、下划线。等价于[A-Za-z0-9_]
。\W
:匹配非字母、数字、下划线。
4. 边界匹配符
\b
:匹配一个单词边界,即字与空格间的位置。\B
:非单词边界匹配。
5. 控制字符和转义字符
\|
:表示逻辑“或”的意思。()
:用于分组,并捕获匹配的文本。\\
:用作转义字符,用于匹配那些具有特殊意义的字符,如.
、*
、?
等。
6. 贪婪与非贪婪模式
- 默认情况下,正则表达式的量词(如
*
、+
、?
、{n}
、{n,}
、{n,m}
)是贪婪的,即它们会尽可能多地匹配字符。 - 要使量词变为非贪婪模式,可以在其后添加
?
,如*?
、+?
、??
、{n}?
、{n,}?
、{n,m}?
。
示例
- 匹配一个或多个数字:
\d+
- 匹配以"abc"开头的字符串:
^abc
- 匹配以"xyz"结尾的字符串:
xyz$
- 匹配邮箱地址(简单示例):
[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}
(注意:这只是一个非常基础的示例,实际匹配邮箱地址的正则表达式要复杂得多)
补充
sort命令
sort
命令是 Linux 和 Unix 系统中用于对文本文件的行进行排序的一个非常有用的工具。它可以按照字母顺序、数字顺序或根据用户自定义的规则对文本行进行排序。sort
命令提供了多种选项来定制排序过程,包括忽略大小写、按数字排序、逆序排序等。
基本用法
sort [选项] [文件...]
如果没有指定文件,sort
命令将从标准输入(stdin)读取数据。
常用选项
-n
:按照数字大小进行排序,而不是按照字符串的字典顺序。-r
:逆序排序。-u
:去除重复行,只显示唯一的行。-f
:忽略大小写差异进行排序。-t
:指定字段分隔符,默认是空白字符(空格和制表符)。-k
:指定排序时考虑的字段,通常与-t
一起使用。-o
:将排序结果输出到指定的文件中,而不是标准输出。
示例
- 基本排序:
这将按照字典顺序对sort file.txt
file.txt
中的行进行排序。 - 按数字排序:
如果sort -n numbers.txt
numbers.txt
包含数字,-n
选项将确保它们按照数值大小而不是字典顺序排序。 - 逆序排序:
这将按照字典顺序的逆序对sort -r file.txt
file.txt
中的行进行排序。 - 去除重复行:
这将去除sort -u file.txt
file.txt
中的重复行,只保留唯一的行。 - 指定字段分隔符和排序字段:
假设你有一个以逗号分隔的值(CSV)文件,并希望根据第二列进行排序:
这里sort -t, -k2 file.csv
-t,
指定了逗号作为字段分隔符,-k2
指定了排序时考虑的字段是第二列。 - 将排序结果保存到文件:
这将把sort file.txt -o sorted_file.txt
file.txt
的排序结果保存到sorted_file.txt
中。
uniq命令
uniq
命令是 Linux 和 Unix 系统中用于从输入数据(或文件)中过滤掉重复行的工具。它通常与 sort
命令结合使用,因为 uniq
只能识别和删除连续重复的行。如果文件中存在非连续重复的行,你需要先使用 sort
命令对文件内容进行排序,然后再使用 uniq
来删除重复的行。
基本用法
uniq [选项] [输入文件] [输出文件]
如果不指定输入文件,uniq
将从标准输入(stdin)读取数据。如果不指定输出文件,结果将被发送到标准输出(stdout)。
常用选项
-c
或--count
:在每行前加上该行在文件中出现的次数。-d
或--repeated
:仅显示重复的行,每个重复行只显示一次。-u
或--unique
:仅显示不重复的行。-i
或--ignore-case
:忽略大小写差异。
示例
- 基本去重:
首先,你需要对文件进行排序,然后使用uniq
来删除重复的行。
这将先对sort file.txt | uniq
file.txt
中的行进行排序,然后删除连续的重复行。 - 计数重复行:
这将显示每行在排序后的文件中出现的次数。sort file.txt | uniq -c
- 仅显示重复的行:
这将仅显示那些在排序后的文件中连续出现的重复行。sort file.txt | uniq -d
- 仅显示唯一的行:
这将仅显示那些在排序后的文件中唯一出现的行。sort file.txt | uniq -u
- 忽略大小写:
如果你的文件包含大小写不同的重复项,并且你想忽略这些大小写差异,你可以使用-i
选项。但请注意,uniq
的-i
选项并不是所有系统都支持,你可能需要先将文件转换为全小写或全大写,然后再进行排序和去重。
这里使用了sort file.txt | tr '[:upper:]' '[:lower:]' | uniq
tr
命令将大写字母转换为小写字母,然后再进行排序和去重。
uniq
命令是处理文本数据时非常有用的工具,特别是当你需要去除或统计重复行时。然而,由于它只能识别和删除连续重复的行,因此经常与sort
命令结合使用。
tr命令
tr
(translate 或 delete characters)命令是 Linux 和 Unix 系统中用于转换或删除字符的工具。它可以从标准输入(stdin)读取数据,对数据进行指定的字符转换或删除操作,然后将结果输出到标准输出(stdout)或指定的文件中。
基本用法
tr [选项] [SET1] [SET2]
或者,如果想要删除字符而不是转换,可以只指定一个集合作为要删除的字符集。
tr -d [SET1]
[SET1]
和[SET2]
是字符集合,它们可以是单个字符、字符范围(例如a-z
表示小写字母)或字符类(例如[:alnum:]
表示字母和数字)。-d
选项用于删除出现在[SET1]
中的字符。
常用选项
-d
:删除指定的字符集。-s
:将连续的重复字符压缩成一个字符,但仅当与-d
一起使用时,它才会删除所有指定的字符,只保留一个。-t
:通常tr
默认将[SET1]
中的第一个字符转换为[SET2]
中的第一个字符,依此类推。-t
选项用于指定转换操作,但实际上在大多数tr
实现中,-t
并不是必需的,因为转换是默认行为。
示例
- 转换大小写:
这将把输入中的所有小写字母转换为大写字母。echo "Hello, World!" | tr 'a-z' 'A-Z'
- 删除字符:
这将删除输入中的所有数字字符。echo "Hello, World! 123" | tr -d '0-9'
- 压缩连续字符:
这将把输入中所有连续的空格压缩成一个空格。但是,请注意echo "Hello, World! " | tr -s ' '
-s
选项在这里实际上并没有与-d
一起使用,因为我们不是在删除字符,而是在转换字符(尽管在这个例子中,我们实际上并没有改变空格字符,只是减少了它们的数量)。不过,tr
的-s
选项通常用于压缩连续出现的字符。 - 删除和压缩结合(虽然
-s
通常与-d
一起使用以压缩并删除字符,但这里仅作为说明):
然而,这个命令实际上只会删除除空格之外的所有字符,并保留一个空格(因为echo "Hello, World!!!" | tr -ds ' '
-d
删除了所有指定的字符,而-s
在这里没有与-d
结合使用时,其效果可能不明显或依赖于具体的tr
实现)。如果你想要删除所有非空格字符并保留一个空格(这实际上是一个不常见的需求,因为tr
不是为此设计的),你可能需要使用其他工具或组合命令来实现。
对于删除特定字符并压缩剩余字符的常见用法,你应该首先使用-d
删除不需要的字符,然后可能使用其他工具(如sed
、awk
或xargs
)来进一步处理输出。
cut命令
cut
命令是 Linux 和 Unix 系统中一个非常实用的文本处理工具,它主要用于按列(或字符)切割文本文件,并将结果输出到标准输出设备(通常是屏幕)或重定向到另一个文件中。
基本语法
cut OPTION... [FILE]...
OPTION...
:一个或多个选项,用于指定cut
命令的行为。[FILE]...
:一个或多个要处理的文件名。如果未指定文件名,cut
将从标准输入读取数据。
常用选项
-b, --bytes=LIST
:仅显示由 LIST 指定的字节位置。LIST 可以是单个数字、逗号分隔的数字列表或范围(如1-5
)。-c, --characters=LIST
:与-b
类似,但它是基于字符的,而不是字节。这对于多字节字符集(如 UTF-8)特别有用。-d, --delimiter=DELIM
:指定字段的分隔符,默认为制表符(Tab)。-f, --fields=LIST
:指定要显示的字段编号,字段由-d
选项指定的分隔符分隔。LIST 可以是单个数字、逗号分隔的数字列表或范围(如1-3
)。--complement
:显示不在 LIST 中的字段(与-f
一起使用)。--output-delimiter=STRING
:设置输出字段的分隔符(默认是输入的分隔符)。
示例
- 按列(字段)切割
假设有一个名为data.txt
的文件,内容如下,字段之间由制表符分隔:
要显示每行的第二列(年龄),可以使用:Name Age City Alice 30 New York Bob 25 Los Angeles
注意:这里cut -d' ' -f2 data.txt
-d' '
实际上是不正确的,因为字段是由制表符分隔的,应该使用-d'\t'
或直接省略-d
(因为制表符是默认分隔符)。正确的命令是:
或者cut -f2 data.txt
cut -d'\t' -f2 data.txt
- 按字节或字符切割
假设有一个名为text.txt
的文件,内容如下:
要显示每行的前5个字符,可以使用:Hello, World!
或者,如果你知道文本是 ASCII 或单字节字符集,也可以使用cut -c1-5 text.txt
-b
:cut -b1-5 text.txt
- 显示除了指定字段之外的所有字段
使用--complement
选项与-f
一起,可以显示除了指定字段之外的所有字段。例如,要显示除了第二列之外的所有列:cut -f2 --complement data.txt