运维文本三剑客详辨

文章目录

  • 前言
  • grep
  • awk
  • sed
    • 删除操作
      • 删除某一行
      • 删除多行
      • 删除匹配的行
      • 删除空格
    • 替换操作
    • 定位域
  • 总结辨析

前言

grep, awk, 和 sed 是三个非常强大的文本处理工具,它们在功能和用法上有一些重叠,但各自也有其独特之处。以下是对这三个工具的详细辨析:

grep

用途:主要用于文本搜索。它能使用正则表达式搜索文本,并打印匹配的行。
特点:简单、快速、高效。它只做一件事,那就是搜索。如果你只需要找到匹配的文本,那么 grep 是最好的选择。

常见参数:

-i:忽略大小写。
例如,grep -i "pattern" file会匹配所有大小写形式为“pattern”的行。

-n:在输出的每行前面加上它所在的文件中它的行号。
例如,grep -n "pattern" file会显示每个匹配行的行号。

-E:启用扩展正则表达式模式匹配。
例如,grep -E '[0-9a-zA-Z]' file.txt在文件中查找包含数字和字母的行。

[0-9a-zA-Z]表示匹配包含数字和字母的字符。

-v:改变匹配的意义,只选择不匹配的行。
例如,grep -v "pattern" file会显示所有不包含“pattern”的行。

-o:显示匹配的行中与PATTERN相匹配的部分。
例如,grep -o "pattern" file会只显示匹配“pattern”的部分,而不是整行。

-c:为每一个输入文件打印一个匹配的行的总数。
例如,grep -c "pattern" file1 file2会分别计算file1和file2中匹配“pattern”的行数。

-l:匹配多个文件时,只显示匹配的文件名。
例如,grep -l "pattern" file1 file2会列出包含“pattern”的文件名。

-L:和上面的-l相对,显示不匹配的文件名。
例如,grep -L "pattern" file1 file2会列出不包含“pattern”的文件名。

-q:安静模式,不向标准输出写任何东西。
例如,grep -q "pattern" file > /dev/null会在不输出任何内容的情况下检查文件中是否存在“pattern”。

-P:使用兼容perl的正则表达式引擎。
例如,grep -P "pattern" file会使用perl兼容的正则表达式来匹配行。


awk

用途:是一种强大的文本分析工具,可以对每一行或字段执行复杂的操作。它有许多参数和选项,但大部分情况下,我们主要关注的是其内置变量、模式和动作。
特点:awk提供了模式匹配、文本/数据提取、报告生成等功能。它不仅可以处理文本,还可以处理数据。

基本语法结构
awk 的基本语法结构是:

awk 'pattern { action }' file

其中:

pattern 是要搜索的模式(可以是正则表达式)。
action 是当模式被找到时要执行的动作。
常见内置变量
$0:表示整行内容。
$1 到 $n:表示当前行的第1个到第n个字段。
FS:输入字段分隔符,默认为空格。
OFS:输出字段分隔符,默认为空格。
NR:当前处理的记录号(行数)。
NF:当前记录的字段数。

示例:
打印文件的第一列
假设有一个文件 data.txt,内容如下:

apple 100  
banana 200  
cherry 300

要打印第一列,可以使用:

awk '{ print $1 }' data.txt

输出:

apple  
banana  
cherry

打印行数大于2的所有行

awk 'NR > 2' data.txt

输出:

cherry 300

修改字段分隔符并打印
假设文件 data.csv 内容如下:

apple,100  
banana,200  
cherry,300

要打印第一列,可以使用:

awk -F',' '{ print $1 }' data.csv

输出:

apple  
banana  
cherry

这里 -F 参数用于设置输入字段分隔符为逗号。

计算文件行数

awk 'END { print NR }' data.txt

输出:

3

在这个例子中,END 是一个特殊的模式,它在处理完所有行后执行。NR 变量保存了处理的行数。

求和
对于同样的 data.txt 文件,计算第二列的总和:

awk '{ sum += $2 } END { print sum }' data.txt

输出:

600

在这个例子中,定义了一个变量 sum(虽然 awk 中并没有提前声明变量的要求),并在每一行中累加第二列的值。在处理完所有行后,打印出总和。

这些示例展示了 awk 的一些基本功能和常见用法。awk 还有更多高级功能和复杂的模式匹配选项,使其成为文本处理的强大工具。


sed

用途:主要用于对文本进行基本的文本转换
特点:sed更专注于流编辑,可以执行基本的文本转换任务,如替换、删除、插入等
部分参数:

-n: 屏蔽默认输出(全部文本)
-i: 直接修改文件内容
-f: 使用sed脚本
-e: 可以指定处理动作表达式
-r: 启用扩展的正则表达式,当与其他选项使用时应作为首个选项

删除操作

sed 命令是利用脚本来处理文本文件的工具,它可以依照脚本的指令来处理、编辑文本文件。以下是 sed 的一些删除操作:

删除某一行

删除第一行:

sed '1d' filename

删除第二行:

sed '2d' filename

删除第 n 行:

sed 'nd' filename,其中 n 需要是实际数字。

删除最后一行:

sed '$d' filename

删除多行

删除 1-3 行:

sed '1,3d' filename

删除第 3 行到最后一行:

sed '3,$d' filename

删除所有空白行:

sed '/^$/d' filename

删除匹配的行

sed '/某字符串/d' filename,其中 /某字符串/ 匹配的是 `//中间放的字符串的行,加^表示匹配行首,如: /^+/ 匹配行首字符串为“+”的行。

删除以 a 开头的行:

sed '/^a.*/d' tmp.txt

反向删除:

sed '/green/!d' test.txt,这个命令会删除不包含 green 的行。

删除空格

删除行首空格:

sed 's/^[ \t]*//g'

删除行末空格:

sed 's/[ \t]*$//g'

删除所有的空格:

sed 's/[[:space:]]//g'

以上就是 sed 的部分删除操作

替换操作

sed 的替换操作主要使用 s 命令,格式如下:

sed 's/oldstring/newstring/' filename

这个命令会把模式空间中匹配的第一个 oldstring(替换前的字符串) 改成 newstring(替换后的字符串),但是这个不会在原文件 filename 中操作。

sed 的替换操作也支持正则表达式,格式如下:

sed -r 's/拓展正则表达式/newstring/' filename

此外,如果要替换所有匹配到的字符串,需要添加 g 选项,如下所示:

sed 's/oldstring/newstring/g' filename

或者:

sed -e 's/foo/bar/g' myfile.txt

以上是 sed 的替换操作,具体使用方法需要根据实际需求选择。

sed 是一种流编辑器,主要用于对文本进行基本的文本转换。它经常用于脚本和命令行工具中,以对文本文件进行自动化处理。

在 sed 中,你可以使用正则表达式来匹配文本,并使用替换、删除等操作来处理这些匹配的文本。

定位域

在 sed 中,通常会对“域”(field)进行操作,而不是整行。域是输入行中的一部分,由分隔符(默认为空格)分隔。

例如,以下文本:

apple 100 banana 300 cherry 200

这里,域是 apple、100、banana、300 和 cherry、200。默认情况下,每个域由空格分隔。

假设你想将第一个数字域(100)替换为 200:

echo "apple 100 banana 300 cherry 200" | sed 's/\([^ ]*\) [0-9]*/\1 200/'

输出:

apple 200 banana 300 cherry 200

这里是怎么做的:

([^ ]) [0-9]:这是一个正则表达式,用于匹配以非空白字符开头、后跟一个空格和一个或多个数字的域。([^ ]) 匹配非空白字符(即第一个域),而 [0-9] 匹配随后的数字。
\1 200:这是替换字符串。\1 引用第一个括号中的模式(即第一个域),然后是 200。
这只是一个简单的例子,但展示了如何在 sed 中定位和操作特定的域。


总结辨析

功能:grep 专注于搜索,awk 提供了更全面的文本分析功能,而 sed 更适合于基本的文本转换任务。
正则表达式:grep 和 awk 都支持正则表达式,但 awk 更强大,提供了更多的正则表达式功能和操作符。
交互性:awk 和 sed 允许你在命令行中直接编辑和修改文本,而 grep 主要用于搜索。
效率:对于简单的搜索任务,grep 通常更快。但当涉及到更复杂的文本处理任务时,awk 和 sed 可能会更有优势。

在选择使用哪个工具时,重要的是要根据你要完成的任务来选择。如果你只需要搜索文本,那么 grep 是最好的选择。如果你需要进行更复杂的文本分析或数据处理,那么 awk 可能是更好的选择。而如果你需要进行基本的文本转换任务,那么 sed 是你的最佳选择。

你可能感兴趣的:(运维)