零基础搞懂Linux三剑客:grep搜索、sed编辑、awk分析,一篇全通关
一,grep
简介
grep 是一个强大的文本搜索工具,用于在输入数据中根据模式进行搜索。它可以用来查找包含特定字符串或符合正则表达式的行,并将匹配的行打印到标准输出。grep 名称来源于 "global regular expression print"(全局正则表达式打印)。这个命令在处理日志文件、配置文件或任何文本数据搜索任务时极为有用。
| | |
|---|
s/pattern/repl/flags | | sed 's/foo/bar/g' file |
d | | sed '/^$/d' file |
p | | sed -n '/error/p' log |
a\文本 | | sed '/start/a\NEW LINE' file |
i\文本 | | sed '2i\HEADER' data.txt |
= | | sed -n '/error/=' log |
基本语法
# 从文件中接收输入grep [选项] '搜索模式' 文件名# 从管道符中接收输入命令 |grep [选项] '搜索模式'
选项
示例
# 从文件中搜索包含hello的行grep 'hello' file.txt# 忽略大小写grep -i 'hello' file.txt# 显示匹配行及其行号grep -n 'hello' file.txt# 打印不包含 "error" 的行grep -v 'error' log.txt# 在当前目录及其子目录中所有 .txt 文件中搜索 "important"grep -r 'important' *.txt# 查找以数字开始,后跟任意字符的行grep '^[0-9].*' data.txt# 过滤以b开头的行grep "^b" file.txt# 过滤以/结尾的行grep '/$' file.txt# 这个命令只排除完全空的行,即不包含任何字符(包括空格和制表符)的行。"$", 其中 表示行的开始,$ 表示行的结束,中间没有其他字符,因此这个正则表达式精确匹配空行。grep -v '^$' file.txt# 这个命令排除的是空行以及只包含空白字符(如空格、制表符等)的行。这里,\s* 表示零个或多个空白字符,因此 "^\s*$" 匹配的是开始是空白字符、结束也是空白字符的行,这包括了完全空的行以及那些只包含空格或制表符的行。grep -v '^\s*$' file.txt
二,awk
简介
awk 是一种强大的文本分析工具,它可以在没有编程经验的情况下,让用户方便地处理文本文件,完成诸如数据提取、过滤、统计、格式化输出等复杂任务。
核心要素
| | |
|---|
$0 | | awk '{print $0}' file |
$1 | | awk '{print $1}' /etc/passwd |
NR | | awk 'NR==10' file |
NF | | awk '{print NF}' data.csv |
-F | | awk -F':' '{print $1}' /etc/passwd |
BEGIN{} | | awk 'BEGIN{sum=0} {sum+=$1} END{print sum}' nums.txt |
基本语法
模式:用于描述满足何种条件的行才会执行后续的动作。如果省略,则对所有行执行动作。域:每一行被分解成多个部分,这些部分被称为“域”(列),默认以空格或制表符分隔,1表示第一列,1表示第一列,2表示第二列,以此类推awk [选项] '模式/条件 {动作}' 输入文件
常用选项
-F:指定输入文件的字段分隔符,默认为空格或制表符。
示例
# 打印文件的所有行awk '{print}' example.txt# 打印文件的第二列awk '{print $2}' example.txt# 只打印包含 "error" 的列awk '/error/ {print}' log.txt# 计算某列的总和awk '{sum += $1} END {print sum}' numbers.txt# 将每行的第一个字段和第三个字段用逗号连接,并打印awk '{print $1 "," $3}' data.csv
三,sed
简介
sed(Stream Editor)是一个强大的文本处理工具,用于在不直接修改源文件的情况下,对文本文件进行自动化编辑、替换、删除、添加等操作。sed 命令常用于批处理脚本中,以完成文本的快速转换工作。
核心用法
| | |
|---|
s/pattern/repl/flags | | sed 's/foo/bar/g' file |
d | | sed '/^$/d' file |
p | | sed -n '/error/p' log |
a\文本 | | sed '/start/a\NEW LINE' file |
i\文本 | | sed '2i\HEADER' data.txt |
= | | sed -n '/error/=' log |
基本语法
s/原始文本/新文本/flags:替换操作,将匹配到的原始文本替换为新文本。常用标志有 g(全局替换)。p:打印操作,打印指定的行。默认情况下,所有行都会被打印,除非使用了 -n 选项。a \ 新文本:追加操作,在匹配到的行之后追加新文本。i \ 新文本:插入操作,在匹配到的行之前插入新文本。c \ 新文本:替换行操作,将匹配到的行替换为新文本。sed [选项] '操作' 输入文件
常用选项
-n:抑制默认的输出行为,只有明确指定打印的行才会被输出。-i:直接修改原文件内容(谨慎使用!)。某些系统可能需要 -i'' 或 -i.bak 来创建备份。
示例
# 将文本文件中的 "old_text" 替换为 "new_text"sed 's/old_text/new_text/g' example.txt# 删除包含 "delete_me" 的行sed '/delete_me/d' file.txt# 只打印包含 "pattern" 的行sed -n '/pattern/p' data.txt# 在包含 "append_here" 的下一行追加 "Appended text"sed '/append_here/a Appended text' input.txt# 在包含 "append_here" 的上一行插入 "Appended text"sed '/append_here/i Appended text' input.txt# 直接在原文件上进行替换操作(谨慎操作,建议先备份文件)sed -i 's/original_text/new_text/g' myfile.txt