目录
一、grep命令
grep 命令用于搜索文本文件中符合条件的字符串(或正则表达式)并输出相关行的命令,表示全局正则表达式打印,广泛用于查找文件中包含特定模式的行。
1.1 基础语法
grep [选项]模式 [文件...]
模式:你要查找的文本模式,支持正则表达式。
文件:指定要搜索的文件。如果不指定文件,grep 会从标准输入(通常是键盘输入)读取数据。
1.2 常用选项
-i | 忽略大小写。搜索时不区分大写和小写字母 |
-v | 反转匹配,显示不包含模式的行 |
-r/-R | 递归查找目录中的所有文件 |
-l | 只显示匹配模式的文件名,而不显示匹配的行 |
-n | 显示匹配行的行号 |
-c | 只显示匹配模式的行数,而不是匹配的行内容 |
-H | 显示匹配模式的文件名,即使只有一个文件时 |
-h | 不显示匹配模式的文件名(默认行为在多个文件时有效) |
-o | 只显示匹配到的部分,而不是整行 |
-w | 匹配整个单词(即模式必须是独立的单词,而不是单词的一部分) |
-x | 匹配整行 |
-e | 允许使用多个模式进行匹配 |
--color | 高亮显示匹配到的字符串(默认开启) |
-F | 表示固定字符串匹配(即不使用正则表达式进行匹配) |
-P | 使用 Perl 正则表达式进行匹配(需要支持 Perl 正则的实现) |
-A | 显示匹配行之后的 N 行 |
-B | 显示匹配行之前的 N 行 |
-C | 显示匹配行的上下 N 行 |
1.3 基础示例
1、在文件中查找单个字符串:
查找 file.txt 文件中包含字符串 hello 的行。
grep "hello" file.txt
2、查找包含特定单词的行(忽略大小写):
查找 file.txt 中包含 hello 或 HELLO 的行。
grep -i "hello" file.txt
3、递归查找目录中的文件:
查找 /home/user/docs 目录下所有 .txt 文件中包含 pattern 的行。
grep -r "pattern" /home/user/docs/*.txt
4、反向查找不包含某模式的行:
查找 file.txt 中不包含 error 的行。
grep -v "error" file.txt
5、查找多个模式的文件:
查找 file1.txt 和 file2.txt 中包含 pattern1 或 pattern2 的行。
grep -e "pattern1" -e "pattern2" file1.txt file2.txt
6、显示匹配的行并加上行号:
查找 pattern 在 file.txt 中的行,并显示行号。
grep -n "pattern" file.txt
7、只显示匹配部分:
查找 pattern 在 file.txt 中的匹配,并仅显示匹配到的部分。
grep -o "pattern" file.txt
8、显示上下文行:
查找 pattern 并显示其前后 2 行内容。
grep -C 2 "pattern" file.txt
1.4 grep与正则表达式
grep 支持正则表达式,允许你执行复杂的模式匹配。你可以使用元字符(如 .、*、[]、^ 等)来构建模式。例如:
. | 匹配任意单个字符 |
* | 匹配前一个字符零次或多次 |
^ | 表示行的开始 |
$ | 表示行的结束 |
[] | 表示字符类,匹配括号中的任意字符 |
| | 表示或操作 |
例如,查找 file.txt 中以 start 开头的行:
grep "^start" file.txt
查找 file.txt 中以 end 结尾的行:
grep "end$" file.txt
1.5 小结
grep 是一个非常强大的文本搜索工具,支持多种选项和正则表达式,广泛用于日志分析、文本文件筛选等场景。通过理解其常用选项和正则表达式,你可以在不同的环境中高效地查找和分析文本。
二、sed命令
sed(stream editor)是一个流编辑器,用于处理文本数据。可以对文本进行查找、替换、删除、插入等多种编辑操作。sed 以流的方式工作,能够逐行处理文件或标准输入中的数据。
2.1 基础语法
sed [选项] '操作' 文件...
操作:sed 用来处理的编辑命令,如替换、删除、插入等。
文件:指定要编辑的文件。如果不指定文件,sed 会从标准输入读取数据。
2.2 常用操作
2.2.1 替换(s),sed 最常见的操作是替换字符串。基本语法如下:
sed 's/old_pattern/new_pattern/' file
这将把每一行中第一个出现的 old_pattern 替换成 new_pattern。
s:表示替换操作。
old_pattern:要匹配的字符串或正则表达式。
new_pattern:替换的内容。
1、g:全局替换,替换行中的所有匹配项,而不仅是第一个。
sed 's/old/new/g' file
2、n:只替换第 n 次匹配。
sed 's/old/new/2' file
示例:
将 file.txt 中所有的 apple 替换为 orange:
sed 's/apple/orange/g' file.txt
将 file.txt 中第一个 apple 替换为 orange:
sed 's/apple/orange/' file.txt
2.2.2 删除行(d)
sed 可以删除文本中的某些行。删除操作的基本语法是:
sed 'nd' file
n:表示要删除的行号,支持范围或正则表达式。
示例:
删除 file.txt 中第 2 行:
sed '2d' file.txt
删除 file.txt 中从第 2 行到第 4 行的内容:
sed '2,4d' file.txt
2.2.3 插入行(i)
sed 可以在指定行的前面插入新行:
sed 'n i\text' file
n:插入位置行号。
text:要插入的文本内容。
示例:
在 file.txt 的第 2 行前插入 This is a new line:
sed '2i\This is a new line' file.txt
2.2.4 追加行(a)
sed 也可以在指定行之后追加新行:
sed 'n a\text' file
n:插入位置行号,追加新行。
text:要追加的文本。
示例:
在 file.txt 的第 2 行后追加 This is an appended line:
sed '2a\This is an appended line' file.txt
2.2.5 替换并保存(-i)
如果你希望直接修改文件而不是输出到标准输出,可以使用 -i 选项进行就地编辑:
sed -i 's/old/new/g' file.txt
这将会把 file.txt 中的所有 old 替换为 new,并直接修改文件内容。
2.2.6 打印行(p)
sed 也可以用于打印出特定的行。常用的方式是与 -n 选项结合使用,来禁止默认的输出,只显示符合条件的行。
sed -n 'np' file
-n:禁止默认打印。
np:打印第 n 行。
示例:
只显示 file.txt 中的第 2 行:
sed -n '2p' file.txt
2.2.7 替换时保留原行内容(&)
在替换过程中,&可以表示匹配的部分,这样可以在新内容中引用它。
sed 's/apple/& pie/' file.txt
这会把 apple 替换为 apple pie。
2.2.8 使用正则表达式
sed 支持使用正则表达式来进行模式匹配。例如:替换以 a 开头的单词:
sed 's/\ba\w*/fruit/' file.txt
这里的 \b 是单词边界,\w* 匹配以 a 开头的单词。
2.3 复杂用法
2.3.1 多条操作
sed 允许在一个命令中执行多个编辑操作,使用分号 ; 或者换行符来分隔:
sed 's/old/new/; s/another/replace/' file.txt
2.3.2 使用正则表达式模式进行操作
sed 支持扩展正则表达式(ERE):
sed -E 's/(apple|banana)/fruit/' file.txt
这里,-E 选项启用了扩展正则表达式,使得括号和 | 变得更加简便。
3.3.3 行范围操作
sed 可以对指定行范围进行操作:
sed '2,4s/old/new/g' file.txt
这将在 file.txt 中的第 2 到第 4 行进行替换。
3.3.4 使用 &引用匹配的文本
在替换中,&可以引用匹配到的字符串:
sed 's/apple/& fruit/' file.txt
这会将 apple 替换为 apple fruit。
2.4 小结
sed 是一个强大的文本处理工具,适用于处理各种流数据。它支持多种编辑操作,如替换、插入、删除等,且支持正则表达式和扩展正则表达式,可以方便地进行复杂的文本操作。
使用 sed 时,可以结合不同的选项和操作来精确控制文本编辑过程。
三、awk命令
awk 可以用来处理和分析文本文件,尤其适用于列和行的操作。awk 的核心特点是基于模式和动作进行文本的处理,支持复杂的文本分析和格式化输出。
3.1 基础语法
awk 'pattern { action }' file
pattern: 用于匹配输入文本的模式。如果匹配成功,则执行随后的 action。
action: 要执行的操作,通常用 {} 包括。没有指定 action 时,默认输出匹配的行。
file: 输入的文件。如果没有指定文件,awk 会从标准输入中读取数据。
3.2 基础用法
3.2.1 基础示例
1、打印文件的每一行
awk '{ print }' filename
这个命令会逐行输出文件内容,相当于 cat filename。
2、打印文件的第一列
awk '{ print $1 }' filename
这里 $1 是指第一列的内容,$2 代表第二列,依此类推。
3.2.2 内置变量
awk 提供了一些内置变量,最常用的包括:
$0: 当前行的所有内容(整个文本行)。
$1, $2, ..., $n: 当前行的第 1 列、第 2 列,依此类推。
NR: 当前记录的编号(即行号)。
NF: 当前行的字段数(列数)。
FS: 字段分隔符,默认是空格或制表符。
OFS: 输出字段分隔符,默认是空格。
例如,打印文件的第 1 列和第 2 列:
awk '{ print $1, $2 }' filename
3.2.3 使用模式
1、基于条件的匹配:
awk '$1 == "John" { print $2 }' filename
这个命令会检查文件每一行的第一列,如果等于 "John",则打印该行的第二列。
2、正则表达式匹配:
awk '$1 ~ /pattern/ { print $0 }' filename
匹配第一列内容包含 pattern 的行,并打印整个行。
3、数字条件:
awk '$3 > 100 { print $0 }' filename
这个命令会打印第三列大于 100 的行。
3.3 常用操作
1、修改分隔符
默认情况下,awk 会以空格和制表符分隔字段。如果希望使用其他分隔符,可以通过设置 FS 和 OFS 来更改。
FS: 输入字段分隔符。
OFS: 输出字段分隔符。
awk 'BEGIN { FS=","; OFS="\t" } { print $1, $2 }' filename
这个命令将输入文件的分隔符设置为逗号(,),输出字段的分隔符设置为制表符(\t)。
2、计算和累加
awk 非常擅长进行数学计算,例如对某一列的求和:
awk '{ sum += $2 } END { print sum }' filename
这条命令会对文件中第二列的所有数值进行累加,并在文件处理结束后输出结果。
3、格式化输出
你可以使用 printf 来实现格式化输出:
awk '{ printf "Name: %-10s Age: %-3s\n", $1, $2 }' filename
这个命令会输出第一列和第二列的数据,且将第一列的长度设为 10,第二列的长度设为
3.4 BEGIN 和 END 块
BEGIN: 在处理文件内容之前执行,用于初始化操作。
END: 在处理完所有文件内容后执行,用于结束时的操作。
awk 'BEGIN { print "Start of file processing" } { print $1 } END { print "End of file processing" }' filename
这个命令会在开始时打印“Start of file processing”,处理每一行时打印第一列,结束时打印“End of file processing”。
3.5 多条件判断
你可以使用逻辑运算符进行更复杂的条件判断。
awk '$1 == "John" && $2 > 30 { print $0 }' filename
这个命令会在第一列为 "John" 且第二列大于 30 时打印该行。
3.6 处理多个文件
awk 可以同时处理多个文件,处理时会将文件内容合并为一个输入流:
awk '{ print $1 }' file1 file2
3.7 小结
awk 是一个非常灵活且强大的文本处理工具,适用于各种文本和数据分析任务。
通过模式匹配和动作执行,可以轻松完成各种复杂的文本处理操作。
学会利用内置变量、条件判断和格式化输出,可以大大提高数据处理效率。