![cover](https://bighead-psy.oss-cn-shanghai.aliyuncs.com/sice/unsplash_code_monitor.jpg)
Linux文本处理利器:grep、sed、awk
本文最后更新于 2024-07-07,文章内容可能已经过时。
- grep:
grep 是一个文本搜索工具,用于搜索文件中的行,这些行匹配一个或多个正则表达式。
它快速、灵活,是文本搜索的标准工具。
grep 支持多种选项,如忽略大小写、递归搜索目录、使用正则表达式等。
常用于快速查找文件中包含特定文本的行。
- sed:
sed(Stream Editor)是一个流编辑器,用于对文本数据进行过滤和转换。
它按照指定的模式执行编辑命令,如插入、删除、替换和转换。
sed 脚本可以非常简洁,适合进行简单的文本替换和模式匹配。
常用于自动化文本编辑任务。
- awk:
awk 是一个强大的文本处理工具,特别适合用来处理结构化数据,如表格数据。
它能够读取文件,并对数据进行模式扫描和处理。
awk 支持复杂的条件语句、循环、数组等编程结构。
常用于数据的提取、排序、计算等。
grep 命令简介
grep 是 Linux 系统中一个非常强大的文本搜索工具,它能够快速地在文件中搜索指定的字符串或模式,并输出匹配的行。grep 是 "Global Regular Expression Print" 的缩写,意味着全局正则表达式打印。
语法结构
grep [OPTIONS] PATTERN [FILE...]
-
OPTIONS:可选的命令行选项。
-
PATTERN:要搜索的模式,可以是简单的字符串或复杂的正则表达式。
-
FILE:要搜索的文件或目录,如果不指定文件,默认为标准输入。
常用选项
-i:忽略大小写差异,使得搜索不区分大小写。
-v:显示不包含匹配文本的行。
-n:显示匹配行的行号。
-c:仅显示匹配行的数量,不显示行内容。
-r 或 -R:递归地在指定目录下的所有文件中搜索。
-e:允许同时搜索多个模式。
-l:仅显示包含匹配文本的文件名。
--color=auto:将匹配的文本以彩色显示,便于区分。
示例
搜索单个文件中的字符串:
grep "hello" file.txt
搜索多个文件中的字符串:
grep "hello" file1.txt file2.txt
同时搜索多个模式:
grep -e "hello" -e "world" file.txt
显示匹配行号:
grep -n "hello" file.txt
显示不匹配的行:
grep -v "hello" file.txt
递归搜索目录中的字符串:
grep -r "hello" directory/
只显示包含匹配文本的文件名:
grep -l "hello" directory/
统计匹配的行数:
grep -c "hello" file.txt
使用正则表达式搜索(假设 PATTERN 是一个正则表达式):
grep -E "regexp" file.txt
高亮显示匹配的文本:
grep --color=auto "hello" file.txt
grep 命令非常灵活,可以通过结合使用不同的选项和正则表达式来执行复杂的文本搜索任务。
掌握 grep 命令对于处理和分析文本数据非常有帮助。
sed 命令简介
sed(Stream Editor)
是一种流编辑器,用于执行基本的文本转换。它读取输入的文本(文件或者标准输入),按照指定的指令执行操作,并将结果输出到标准输出(或者文件)。
语法结构
sed [OPTIONS] 'COMMANDS' [FILE...]
-
OPTIONS:可选的命令行选项。
-
COMMANDS:要执行的 sed 命令序列,通常用单引号括起来。
-
FILE:要处理的文件或文件列表,如果不指定,sed 会从标准输入读取。
常用命令
s:替换指定模式。
d:删除指定行。
i:在指定行前插入文本。
c:替换指定行。
y:字符转换。
p:打印行。
a:在指定行后追加文本。
q:退出 sed。
选项
-i:直接修改文件,而不是输出到标准输出。
-n:仅打印经过 sed 命令处理的行。
-e:执行一个 sed 命令脚本。
示例
替换文件中的指定字符串:
sed 's/hello/world/' file.txt
删除文件中的指定行:
sed '3d' file.txt
在文件中指定行后插入指定字符串:
sed '2i\hello world' file.txt
替换文件中指定行的内容:
sed '3c\hello world' file.txt
在文件中指定行后追加文本:
sed '2a\
This is a new line added after line 2\
' file.txt
打印文件中匹配的行:
sed -n '/world/p' file.txt
字符转换:
sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' file.txt
使用正则表达式进行替换:
sed 's/[0-9]/& /g' file.txt # 将数字后添加空格
使用模式匹配进行删除:
sed '/^$/d' file.txt # 删除空行
直接修改文件:
sed -i 's/old/new/' file.txt
多命令执行:
sed -e 's/old/new/' -e 's/yes/no/' file.txt
打印不匹配的行:
sed -n '/old/!p' file.txt
sed 是一个功能强大的文本处理工具,它不仅可以用于简单的文本替换和删除,还可以通过编写复杂的脚本来执行更高级的文本处理任务。
掌握 sed 命令对于自动化文本编辑和数据清洗非常有用。
awk 命令简介
awk
是一种强大的文本处理工具,它不仅能够格式化和过滤文本数据,还能进行复杂的计算和数据处理。awk 的名称来源于其作者 Alfred V. Aho、Peter J. Weinberger 和 Brian W. Kernighan 的姓氏首字母。
语法结构
awk [OPTIONS] 'PROGRAM' [FILE...]
-
OPTIONS:可选的命令行选项。
-
PROGRAM:awk 程序,包含模式和要执行的动作,通常用单引号括起来。
-
FILE:要处理的文件或文件列表,如果不指定,awk 会从标准输入读取。
常用选项
-F:设置输入字段分隔符。
-v:向 awk 程序传递外部变量。
--field-separators:设置字段分隔符。
--record-separators:设置记录分隔符。
基本元素
-
PATTERN:可以是特定的文本、正则表达式或空(表示所有记录)。
-
ACTION:当模式匹配时执行的命令或代码块。
示例
打印文件中的所有行:
awk '{print}' file.txt
打印文件中第二列的内容:
awk '{print $2}' file.txt
计算文件中所有数字的总和:
awk '{sum += $1} END {print sum}' file.txt
打印文件中包含指定字符串的行:
awk '/hello/ {print}' file.txt
在文件中指定列后面添加指定字符串:
awk '{$3 = $3 "hello"} {print}' file.txt
使用字段分隔符:
awk -F":" '{print $1}' /etc/passwd
条件判断:
awk '{if ($1 > 100) print $0}' file.txt
循环结构:
awk '{for (i = 1; i <= NF; i++) print $i}' file.txt
格式化输出:
awk '{printf "%-15s %-10s\n", $1, $2}' file.txt
使用外部变量:
awk -v var="value" '{print var}' file.txt
多模式匹配:
awk '/pattern1/,/pattern2/' file.txt
自定义函数:
awk '{func()} {print} function func() {print "This is a custom function"}'
处理多个文件:
awk '{...}' file1.txt file2.txt
awk 的强大之处在于其内置的变量、控制流语句和函数,这使得它能够处理复杂的文本和数据。
通过编写 awk 脚本,用户可以轻松实现数据的提取、转换和报告生成。
Linux平台上除了以上三个常用的文本处理工具,还有其他的文本处理命令如:uniq、sort 、tr 、cut、tee
等
- 感谢你赐予我前进的力量