文本处理命令行工具以及正则表达式

grep

grep 是一个在Linux中用于文本搜索的命令。它的主要功能是在文件中查找包含指定字符串或符合正则表达式模式的行,并将这些行显示在终端上。以下是 grep 命令的一些常见用法和选项:

  • 基本用法:

忽略大小写: 使用 -i 选项可以忽略大小写,使搜索不区分大小写。例如:

grep -i 'pattern' file
  • 显示行号: 使用 -n 选项可以显示匹配行的行号。例如:
grep -n 'pattern' file
  • 限制匹配的行数:通过指定 -m 后面的数字参数,可以控制 grep 仅匹配指定数量的行并停止搜索。
grep -m 3 'pattern' file
查找匹配 "pattern" 的前三行,一旦找到三个匹配,它将停止搜索,而不会继续查找文件中的其他匹配行。
  • 递归搜索目录: 使用 -r 选项可以递归搜索指定目录下的所有文件。例如:
grep -r 'pattern' /path/to/directory
  • 统计匹配行数: 使用 -c 选项可以统计匹配模式的行数,而不是显示匹配的行。例如:
grep -c 'pattern' file
  • 反向匹配: 使用 -v 选项可以显示不包含匹配模式的行。例如:
grep -v 'pattern' file
  • 使用管道: grep 命令可以与其他命令一起使用,通过管道来处理文本数据。例如,可以使用 cat 命令查看文件内容并将其传递给 grep 进行搜索:
cat file.txt | grep 'pattern'
  • 显示匹配模式的字符数: 使用 -o 选项可以仅显示匹配模式的字符,而不是整个匹配行。
grep -o 'pattern' file
- -`C` 选项用于在 `grep` 命令中指定上下文行的数量,以便显示匹配模式的周围文本行。可以使用 `-C` 后面跟着一个数字参数,该参数表示要显示的上下文行数。这对于更好地理解匹配行的上下文非常有用。

  例如,如果想在匹配行的上下文中显示两行文本,可以使用 `-C 2` 选项,如下所示:

Shell grep -C 2 'pattern' file

- `-e` 选项在 `grep` 命令中用于指定要匹配的模式或正则表达式。它通常用于区分多个模式,以便在同一次 `grep` 命令中搜索多个模式。

  你可以使用 `-e` 后面跟着要匹配的模式或正则表达式,如下所示:

Shell grep -e 'pattern1' -e 'pattern2' file

  这将在文件中同时搜索 "pattern1" 和 "pattern2",并显示包含这些模式的行。

  `-e` 选项非常有用,当你需要在同一次搜索中匹配多个不同的模式时。这可以简化命令并减少不必要的重复。

- `-w` 选项是 `grep` 命令的一个选项,它用于确保匹配的模式是整个单词,而不是单词的一部分。这对于确保准确匹配整个单词非常有用,而不是包含该单词的子字符串。

  例如,如果你想查找包含单词 "apple" 的行,而不是包含 "pineapple" 或 "apples" 的行,你可以使用 `-w` 选项:

Shell grep -w 'apple' file

  这将只匹配包含单词 "apple" 的行,而不会匹配包含 "pineapple" 或 "apples" 的行。

  `-w` 选项对于确保精确的单词匹配非常有用,尤其是在处理文本数据时需要区分单词。

- `-E` 选项是 `grep` 命令的一个扩展正则表达式选项,它允许你使用更强大的正则表达式语法来进行文本搜索。通常,`grep` 使用基本正则表达式语法,但当你使用 `-E` 选项时,可以使用扩展正则表达式语法。

  扩展正则表达式语法支持更多的元字符和模式匹配选项,包括括号分组、重复次数限制、字符类等。这使得更复杂的模式匹配变得可能。

  以下是一些使用 `-E` 选项的示例:

  - 使用括号分组:

    ```Shell
grep -E '(apple|banana)' file
这将匹配包含 "apple" 或 "banana" 的行。
  • 使用重复次数限制:

    ```Shell grep -E 'a{2,4}' file

    这将匹配包含 2 到 4 个连续的 "a" 字符的行。

  - 使用字符类:

    ```Shell
grep -E '[0-9]{3}-[0-9]{2}-[0-9]{4}' file
这将匹配包含美国社会安全号码的行,其格式为 "###-##-####"。

-E 选项允许你更灵活地定义和匹配模式,特别是在需要更复杂的文本搜索和分析时非常有用。它扩展了 grep 命令的正则表达式功能。

  • -f 选项是 grep 命令的一个选项,它允许你从一个文件中读取内容列表,然后在指定的文件中搜索这些内容。这对于需要同时搜索多个内容的情况非常有用。

    使用 -f 选项时,你需要指定一个包含内容的文件,grep 将会按照文件中内容的顺序逐个匹配这些内容。例如:

grep -f patterns.txt data.txt

上述命令将从 patterns.txt 文件中读取内容,然后在 data.txt 文件中搜索这些内容,显示包含任何模式的行。

patterns.txt 文件的内容可能如下所示:

```Plain Text apple banana cherry

  这个文件包含了要在 `data.txt` 文件中搜索的内容列表。

  使用 `-f` 选项的一个主要用途是在需要搜索多个相关内容的情况下,可以将这些内容保存在一个文件中,而不必在命令行中逐个指定它们。这对于处理大量内容或需要定期更新内容列表的情况非常方便。

- `-r` 选项是 `grep` 命令的一个递归选项,用于在指定目录及其子目录中递归地搜索文件内容。这对于在整个目录结构中查找匹配模式的文件非常有用。不能操作软连接

  使用 `-r` 选项时,你需要指定一个目录作为搜索的起始点,`grep` 将会递归搜索这个目录及其所有子目录中的文件。例如:

Shell grep -r 'pattern' /path/to/directory

  上述命令将从 `/path/to/directory` 目录开始递归搜索,找到包含 "pattern" 的文件并显示匹配行。

  递归搜索非常适合在大型目录结构中查找特定模式的文件,尤其是当你不确定模式所在的确切位置时。你可以使用 `-r` 选项来搜索整个目录树,而不必手动进入每个子目录进行搜索。

- 在大多数 `grep` 版本中,`-R` 选项与 `-r` 选项类似,用于递归搜索目录及其子目录中的文件内容。它通常用于 Linux 系统中的 `grep` 命令。可以处理软连接

Shell grep -R 'pattern' /path/to/directory

  与 `-r` 相似,`-R` 选项也用于递归搜索指定目录下的文件内容,寻找包含指定模式的行。这对于在整个目录结构中搜索匹配的内容非常有用。

  在一些 `grep` 版本中,`-R` 可能默认启用,因此使用它与使用 `-r` 没有明显区别。在另一些版本中,它可能略有不同,但主要目的仍然是递归搜索。

  总的来说,`-R` 选项是 `grep` 命令的一个变体,用于在目录及其子目录中递归搜索文件内容,查找匹配指定模式的行。

- `-E` 是 `grep` 命令的一个选项,用于启用扩展正则表达式的匹配模式。扩展正则表达式提供了更丰富的模式匹配功能,包括元字符和语法,使你能够更精确地定义搜索模式。

  当你使用 `-E` 选项时,你可以在搜索模式中使用扩展正则表达式的元字符,例如 `+`、`?`、`|` 等,以及使用括号来创建分组。这允许你编写更复杂和具体的搜索模式。

  例如,以下命令使用 `-E` 选项来搜索包含 "apple" 或 "banana" 的行:

Shell grep -E 'apple|banana' filename

  这将匹配包含 "apple" 或 "banana" 的行,而不是仅匹配字面字符串 "apple|banana"。

  `-E` 选项在需要进行高级模式匹配时非常有用,因为它允许你更自由地定义搜索条件。如果你不使用 `-E` 选项,则 `grep` 默认使用基本正则表达式,其中某些元字符(如 `+` 和 `|`)需要进行转义,而 `-E` 选项省去了这些转义步骤。

# sort排序

Linux中的`sort`命令用于对文本文件的内容进行排序。它默认按照每行的字母顺序,对文件内容进行排序,但也可以根据需要进行自定义排序。以下是`sort`命令的一些常见用法和参数:

**基本用法**:

CSS sort [选项] [文件]

**常见选项**:

- `-b`:忽略每行前面开始出的空格字符。

- `-c`:检查文件是否已排序,如果没有排序则输出相应的信息。

- `-d`:按照字典顺序(区分大小写)排序。

- `-f`:忽略大小写,按照字典顺序排序,默认把大写字母排在前面

- `-i`:忽略非打印字符,只对可打印字符排序。

- `-n`:按照数值大小排序。

- `-r`:逆序排序。

- `-t`:指定字段分隔符。

- `-k field1[,field2]`:按指定字段排序。

**示例**:

1. 对文件进行默认排序:

Shell sort file.txt

2. 忽略大小写进行排序:

Shell sort -f file.txt

3. 按照第二列字段进行排序,以逆序输出:

Shell sort -t',' -k2,2 -r file.csv

4. 检查文件是否已排序:

Shell sort -c file.txt

5.按行号排序

Shell cat -n file.txt | sort -nr

6.按源文件顺序排序,并输出到一个指定文件

Shell cat -n /etc/passwd | sort -no file.txt

# uniq去重

按行进行处理,去除连续重复的行

Shell uniq [OPTION]… [INPUT [OUTPUT]]

- `OPTION`:可选参数,用于指定`uniq`命令的行为。

- `INPUT`:可选参数,指定要处理的输入文件。如果未提供输入文件,则`uniq`将从标准输入读取数据。

- `OUTPUT`:可选参数,指定输出结果的文件。如果未提供输出文件,则`uniq`将结果输出到标准输出。

一些常用的选项包括:

- `-d`:仅显示重复的行。

- `-u`:仅显示不重复的行。

- `-c`:显示每行重复出现的次数。

下面是一些示例用法:

5. 检查文件并删除其中重复的行,并在标准输出中显示不重复的行:

Shell uniq input.txt

6. 检查文件并删除其中重复的行,然后将结果输出到另一个文件:

Shell uniq input.txt output.txt

7. 显示文件中重复的行和它们出现的次数:

Shell uniq -c input.txt

8. 显示文件中重复的行,但不显示不重复的行:

Shell uniq -d input.txt

这些是`uniq`命令的一些基本用法。根据您的需求,您可以使用不同的选项来处理文本文件中的重复行。

# tr替换删除

`tr`是一个用于字符转换的命令行工具。它通常用于替换文本中的字符、删除字符或对字符进行转换。以下是一些`tr`命令的常见用法和示例:

- `-d`:删除指定字符集中的字符。

Lua tr -d '0-9' < input.txt > output.txt

  这个选项将删除输入文件中的所有数字字符。

- `-s`:压缩字符集中的重复字符。

Shell echo "hello" | tr -s 'l'

  这个选项将字符串 "hello" 中的重复字符 'l' 压缩为单个字符。

- `-c`:对字符集取补集。保留未被指定的字符,而将指定字符集以外的字符替换为特定字符

Shell echo "hello" | tr -c 'a-z' '*'

  这个选项将输入字符串中的非小写字母字符替换为 '*'。

- `-t`:指定要转换的字符集。

Shell echo "123" | tr -t '123' 'ABC'

  这个选项将输入字符串中的 '1' 替换为 'A','2' 替换为 'B','3' 替换为 'C'。

- `-u`:将输出限制为不重复的字符。

Shell echo "hello" | tr -u 'l'

  这个选项将输出字符串中的 'l' 重复字符去除,结果为 "helo"。

# cut剪切

`cut`命令是一个用于文本处理的实用程序,通常用于从文本文件中剪切出指定部分并将结果输出到标准输出或另一个文件。`cut`命令的主要用途是从每行文本中截取指定字段或字符,以便进一步处理或分析数据。

- `-b`:按字节位置切割。

  - 示例:提取文本文件的第 2 到 5 个字节。

    ```CSS
cut -b 2-5 input.txt
  • -c:按字符位置切割。

  • 示例:提取文本文件的第 2 到 5 个字符。

    ```Shell cut -c 2-5 input.txt

- `-d`:指定字段的分隔符。

  - 示例:使用逗号作为分隔符,提取逗号分隔的第 2 个字段。

    ```Shell
cut -d ',' -f 2 input.txt
  • -f:指定要提取的字段。

  • 示例:提取制表符分隔的文本文件的第 3 个字段。

    ```Shell cut -f 3 input.txt

- `--complement`:反选,输出未包含指定字段的部分。

  - 示例:提取文本文件的第 1 到 3 个字段之外的部分。

    ```CSS
cut --complement -f 1-3 input.txt
  • -s:在没有匹配到分隔符的行上不输出任何内容。

  • 示例:在逗号分隔的文件中,只提取包含两个字段的行。

    ```Shell cut -d ',' -f 1,2 -s input.txt

---

如何对文件进行拆分

  现有一个日志文件,5G,直接打开速度很慢,有什么办法优化呢?

  对文件进行拆分,文件大于2G按大小分,小于按行分

# split分割

`split`命令用于将一个文件分割成多个较小的文件,可以按照不同的标准进行分割,如文件大小、行数或字节数。以下是`split`命令的基本语法和一些常见选项:

Shell split [选项] [要切割的文件] [输出文件名的前缀]

常见选项包括:

- `-b<字节>`:指定每个输出文件的大小,单位为字节。您可以使用K(千字节)、M(兆字节)、G(千兆字节)等单位。

- `-C<字节>`:与`-b`选项类似,但它尽量维持每行的完整性,确保不会在行的中间切割。

- `-l<行数>`:指定每个输出文件包含的行数。

- `-a<后缀长度>`:指定输出文件名的后缀长度,默认为2,通常以字母组合(如aa、ab、ac)的顺序排序。

以下是一些示例用法:

9. 将文件分割为固定大小的块(以MB为单位):

Shell split -b 10M largefile.txt output

10. 将文件分割为包含100行的部分:

Shell split -l 100 myfile.txt output

11. 指定后缀长度为3,并分割文件:

Shell split -a 3 myfile.txt output

# paste合并

合并文件的行。它按顺序打印来自每个文件的相应行,每行之间用制表符分隔并并列显示。

以下是一些 `paste` 命令的常用选项和示例:

基本语法如下:

CSS paste [选项] [文件1名称] [文件2名称]…

一些常用选项包括:

- `-d` 或 `--delimiters=LIST`:允许指定一个定界符的列表,该定界符将用于分隔每个文件中的文本行。

- `-s` 或 `--serial`:以串联方式合并文件,而不是并联方式。这意味着第一个文件的第一行将与第二个文件的第一行合并,以此类推。

- `-u` 或 `--uniq`:在合并文件时删除任何重复的行。

示例:

12. 合并两个文件并使用制表符分隔它们的行:

Shell paste file1.txt file2.txt

13. 合并三个文件并使用逗号作为定界符:

Shell paste -d',' file1.txt file2.txt file3.txt

14. 以串联方式合并两个文件:

Shell paste -s file1.txt file2.txt

15. 合并两个文件并删除重复的行:

Shell paste -u file1.txt file2.txt ```

正则表达式:

可以理解为是规则表达式,通过代码中用字符串编写的表达式规定一种字符串的规则(格式),限定字符串中指定类型的字符出现的顺序和次数。

通配符

配符是用于文件名匹配和选择的特殊字符。通配符允许根据模式匹配文件名,以便执行各种文件操作

  • *(星号):匹配零个或多个字符。例如,*.txt 匹配所有以 ".txt" 结尾的文件。

  • ?(问号):匹配任何单个字符。例如,file?.txt 匹配 "file1.txt"、"fileA.txt" 等。

  • [](方括号):用于指定字符类,匹配其中任何一个字符。例如,[aeiou] 匹配任何元音字母,[0-9] 匹配任何数字。

  • [!][^]:否定字符类,匹配未包含在方括号内的任何字符。例如,[!aeiou][^aeiou] 匹配非元音字母。

  • {}(花括号):用于创建一个组合模式,可以匹配其中任何一个模式。例如,{file1,file2}.txt 匹配 "file1.txt" 或 "file2.txt"。

元字符

元字符(Metacharacters)是具有特殊含义的字符,用于定义模式匹配规则。

  • .(句点):匹配任何单个字符,除了换行符。例如,a.b 匹配 "axb"、"ayb" 等。

  • *(星号):匹配前一个字符的零次或多次出现。例如,a* 匹配 ""(空字符串)、"a"、"aa" 等。

  • +(加号):匹配前一个字符的一次或多次出现。例如,a+ 匹配 "a"、"aa"、但不匹配 ""。

  • ?(问号):匹配前一个字符的零次或一次出现。例如,a? 匹配 "" 或 "a"。

  • [](方括号):用于指定字符类,匹配其中任何一个字符。例如,[aeiou] 匹配任何元音字母。

  • [^][^]:否定字符类,匹配未包含在方括号内的任何字符。例如,[^0-9] 匹配任何非数字字符。

  • [[:blank:]] :匹配空格字符和制表符(tab)字符。这个字符类是一种更通用的方式来匹配空白字符,而不仅仅是空格字符。

  • [[:digit:]]:匹配任何数字字符。

  • [[:alpha:]]:匹配任何字母字符。

  • [[:alnum:]]:匹配任何字母或数字字符。

  • [[:space:]]:匹配任何空白字符,包括空格、制表符、换行符等。

  • [:cntrl:] 不可打印的控制字符(退格、删除、警铃…)

  • [:digit:] 十进制数字

  • [:xdigit:]十六进制数字

  • [:graph:] 可打印的非空白字符

  • [:print:] 可打印字符

  • [:punct:] 标点符号

  • ^(插入符号):在模式的开头匹配字符串的开头,用于匹配行的开头。例如,^abc 匹配以 "abc" 开头的字符串。

  • $(美元符号):在模式的末尾匹配字符串的末尾,用于匹配行的结尾。例如,xyz$ 匹配以 "xyz" 结尾的字符串。

  • \(反斜杠):用于转义元字符,使其失去特殊含义。例如,\. 匹配实际的句点字符。

    \w #匹配单词构成部分,等价于[[:alnum:]] \W#匹配非单词构成部分,等价于[^[:alnum:]] \S #匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 \s #匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。

  • |(管道符号):用于指定多个模式之间的"或"关系。例如,cat|dog 匹配 "cat" 或 "dog"。

  • ()(圆括号):用于创建子表达式,可以用于分组和捕获匹配的内容。

匹配次数

*:匹配前面的字符任意次,包括0次。尽可能长的匹配

.*:匹配前面的任意字符任意次,但是不包括0次

\?:匹配前面的字符,出现0次或者1次,可有可无

\+:匹配前面出现的字符最少1次,最多无限次

\{n\}:表示前面的字符只能出现n次

\{n,m\}:表示前面字符最少出现n次,最多出现m次

\{,n\}:表示前面的字符最多出现n次,≤n

\{n,\}:表示前面的字符最少出现n次,≥n

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值