一.awk
awk
是一种强大的文本处理工具,在 Linux 系统中被广泛使用。它的基本语法如下:
awk 'pattern { action }' filename
其中,pattern
是匹配条件,而 action
是对匹配行执行的操作。以下是一些常见的 awk
使用方式:
1. 打印文本:
# 打印文件的第一列
awk '{print $1}' filename
2. 条件匹配:
# 打印包含关键字 "pattern" 的行
awk '/pattern/ {print}' filename
# 打印第一列包含 "keyword" 的行
awk '$1 ~ /keyword/ {print}' filename
3. 数学运算:
# 计算文件中第二列的总和
awk '{sum += $2} END {print sum}' filename
4. 字段分隔符:
# 使用逗号作为字段分隔符,打印第二列
awk -F',' '{print $2}' filename
5. 多个操作:
# 打印第一列包含 "error" 的行,并计算第二列的总和
awk '/error/ {print; sum += $2} END {print "Total:", sum}' filename
6. 自定义输出格式:
# 使用自定义输出格式打印第一列和第三列
awk '{printf "Column 1: %s, Column 3: %s\n", $1, $3}' filename
7. 多文件处理:
# 处理多个文件
awk '{print FILENAME, $0}' file1.txt file2.txt
8. 使用脚本文件:
将 awk
命令放入脚本文件中,例如 myscript.awk
:
# myscript.awk
/pattern/ {print}
然后运行:
awk -f myscript.awk filename
9. 使用条件语句:
# 如果第一列大于 10,则打印整行
awk '$1 > 10 {print}' filename
10. 文本替换:
# 替换每行中的 "old" 为 "new"
awk '{gsub(/old/, "new"); print}' filename
11. 指定字段范围:
# 打印第二到第四列
awk '{print $2, $3, $4}' filename
12. 使用函数:
# 使用 length 函数打印每行的字符数
awk '{print "Length:", length}' filename
13. 字段间的计算:
# 计算每行第二列和第三列的和
awk '{sum = $2 + $3; print "Sum:", sum}' filename
14. 处理列头:
# 跳过第一行(列头),打印剩余行
awk 'NR > 1 {print}' filename
15. 逻辑运算:
# 打印第一列大于 5 且第二列小于 10 的行
awk '$1 > 5 && $2 < 10 {print}' filename
16. 使用 BEGIN 和 END:
# 在处理开始前和结束后执行操作
awk 'BEGIN {print "Processing starts"} {print} END {print "Processing ends"}' filename
17. 分组统计:
# 按照第一列分组统计数量
awk '{count[$1]++} END {for (item in count) print item, count[item]}' filename
18. 自定义字段输出分隔符:
# 使用 ";" 作为输出字段分隔符,打印第一列和第二列
awk -v OFS=';' '{print $1, $2}' filename
19. 使用 AWK
脚本文件:
将 awk
命令放入脚本文件中,例如 myscript.awk
:
# myscript.awk
{
if ($1 > 10) {
print "Column 1 is greater than 10:", $1
} else {
print "Column 1 is not greater than 10:", $1
}
}
然后运行:
awk -f myscript.awk filename
20. 排序和去重:
# 根据第一列排序并去重
awk '!seen[$1]++' filename | sort -k1
21. 计算平均值:
# 计算第二列的平均值
awk '{sum += $2} END {print "Average:", sum/NR}' filename
22. 输出特定行数:
# 打印前 5 行
awk 'NR <= 5' filename
23. 执行系统命令:
# 执行系统命令并获取输出
awk '{cmd = "echo " $1 "| wc -c"; cmd | getline result; close(cmd); print result}' filename
24. 处理 CSV 文件:
# 处理逗号分隔的文件,打印第一列和第三列
awk -F',' '{print $1, $3}' filename.csv
25. 使用正则表达式:
# 打印包含数字的行
awk '/[0-9]/ {print}' filename
二.grep
grep
是一个在 Linux 和其他类 Unix 系统中用于搜索文本的强大命令。它的基本语法如下:
grep [options] pattern [files]
其中,pattern
是你要搜索的模式,而 [files]
是你要搜索的文件。以下是一些常见的 grep
使用方式:
1. 基本搜索:
# 在文件中搜索包含 "pattern" 的行
grep "pattern" filename
2. 忽略大小写:
# 在文件中搜索包含 "pattern" 的行,忽略大小写
grep -i "pattern" filename
3. 显示匹配行数:
# 在文件中搜索包含 "pattern" 的行,并显示匹配行的行数
grep -c "pattern" filename
4. 显示非匹配行数:
# 在文件中搜索不包含 "pattern" 的行,并显示非匹配行的行数
grep -vc "pattern" filename
5. 显示匹配行的行号:
# 在文件中搜索包含 "pattern" 的行,并显示匹配行的行号
grep -n "pattern" filename
6. 显示不匹配的行号:
# 在文件中搜索不包含 "pattern" 的行,并显示不匹配行的行号
grep -vn "pattern" filename
7. 递归搜索目录:
# 递归搜索目录中包含 "pattern" 的文件
grep -r "pattern" directory
8. 显示匹配内容:
# 在文件中搜索包含 "pattern" 的行,并显示匹配的内容
grep -o "pattern" filename
9. 显示行数:
# 在文件中搜索包含 "pattern" 的行,并显示匹配行的行数
grep -c "pattern" filename
10. 显示行数和文件名:
# 在多个文件中搜索包含 "pattern" 的行,并显示匹配行的行数和文件名
grep -H -c "pattern" file1 file2
11. 反向匹配:
# 在文件中搜索不包含 "pattern" 的行
grep -v "pattern" filename
12. 使用正则表达式:
# 在文件中使用正则表达式搜索
grep -E "[0-9]+" filename
13. 显示匹配行之前/之后的内容:
# 在文件中搜索包含 "pattern" 的行,并显示匹配行之前的 2 行
grep -B 2 "pattern" filename
# 在文件中搜索包含 "pattern" 的行,并显示匹配行之后的 2 行
grep -A 2 "pattern" filename
14. 显示匹配行之前和之后的内容:
# 在文件中搜索包含 "pattern" 的行,并显示匹配行之前和之后的 2 行
grep -C 2 "pattern" filename
15. 使用多个模式:
# 在文件中搜索同时包含 "pattern1" 和 "pattern2" 的行
grep -e "pattern1" -e "pattern2" filename
16. 仅显示匹配内容而不显示整行:
# 仅显示包含 "pattern" 的部分内容,而不是整行
echo "some text with pattern and more" | grep -o "pattern"
17. 搜索并排除特定文件:
# 在所有文件中搜索 "pattern",但排除以 ".log" 结尾的文件
grep "pattern" --exclude="*.log" *
18. 列出匹配的文件名:
# 列出包含 "pattern" 的文件名
grep -l "pattern" *
19. 显示匹配的行数及其内容:
# 显示匹配 "pattern" 的行数及其内容
grep -n "pattern" filename
20. 显示行数并忽略二进制文件:
# 在文件中搜索包含 "pattern" 的行,并显示匹配行的行数,但忽略二进制文件
grep -n "pattern" filename --text
21. 递归搜索目录并显示匹配的文件名:
# 递归搜索目录中包含 "pattern" 的文件,并显示匹配的文件名
grep -r -l "pattern" directory
22. 显示匹配的行数及其上下文:
# 显示包含 "pattern" 的行数及其上下文
grep -C 2 "pattern" filename
23. 显示文件中所有不匹配的行:
# 显示文件中所有不包含 "pattern" 的行
grep -v "pattern" filename
24. 显示文件中所有匹配的行,并显示匹配内容所在的字符位置:
# 显示文件中所有包含 "pattern" 的行,及其在行中的字符位置
grep -o -b "pattern" filename
25. 使用过滤条件进行搜索:
# 通过管道将命令的输出传递给 grep 进行搜索
ls -l | grep "pattern"
三.sed
sed
(Stream Editor)是一个在 Linux 和类 Unix 系统中用于文本处理的流编辑器。它以行为单位处理文本,可以执行替换、删除、添加等操作。以下是一些常见的 sed
使用方式:
1. 文本替换:
# 将文件中所有的 "old" 替换为 "new"
sed 's/old/new/g' filename
2. 只替换第一个匹配:
# 只替换每行的第一个 "old"
sed 's/old/new/' filename
3. 替换特定行:
# 替换第三行的 "old" 为 "new"
sed '3s/old/new/' filename
4. 删除匹配行:
# 删除包含 "pattern" 的行
sed '/pattern/d' filename
5. 删除空白行:
# 删除空白行
sed '/^$/d' filename
6. 插入行:
# 在匹配行后插入新行
sed '/pattern/a\New line' filename
7. 在行首添加内容:
# 在每行前添加 "prefix"
sed 's/^/prefix/' filename
8. 在行尾添加内容:
# 在每行末尾添加 "suffix"
sed 's/$/suffix/' filename
9. 使用正则表达式替换:
# 使用正则表达式替换
sed 's/[0-9]\+/NUM/' filename
10. 删除行首空格:
# 删除每行的行首空格
sed 's/^ *//' filename
11. 删除行尾空格:
# 删除每行的行尾空格
sed 's/ *$//' filename
12. 删除多个空白:
# 删除多个连续的空白,只保留一个空白
sed 's/ \+/ /g' filename
13. 替换并保存到新文件:
# 将替换结果保存到新文件
sed 's/old/new/g' filename > newfile
14. 在文件中插入内容:
# 在文件开头插入新行
sed '1i\New line' filename
15. 在文件结尾插入内容:
# 在文件结尾插入新行
sed '$a\End of file' filename
16. 替换指定范围内的内容:
# 在 2-5 行替换 "old" 为 "new"
sed '2,5s/old/new/g' filename
17. 打印指定行:
# 打印第三行
sed -n '3p' filename
18. 打印指定范围的行:
# 打印 3-6 行
sed -n '3,6p' filename
19. 删除指定范围的行:
# 删除 4-7 行
sed '4,7d' filename
20. 使用变量:
# 使用变量进行替换
variable="new"
sed "s/old/$variable/g" filename
四.结合使用场景
结合使用 awk
, grep
, 和 sed
可以构建强大的文本处理管道,适用于各种场景。以下是一些示例场景:
场景一:提取日志中的关键信息
假设有一个日志文件 logfile.txt
,其中包含了很多信息,但你只关心包含关键字 "error" 的行,并希望提取出其中的时间戳和错误描述。
grep "error" logfile.txt | awk '{print $1, $2, $NF}' | sed 's/,//'
这个命令首先使用 grep
筛选出包含 "error" 的行,然后通过 awk
提取出时间戳和最后一个字段(假设错误描述在最后一个字段),最后通过 sed
去除可能存在的逗号。
场景二:过滤和格式化日志信息
假设有一个日志文件 app.log
,其中包含了各种信息,你想要提取出包含 "ERROR" 的行,并格式化输出错误的时间戳和错误信息。
grep "ERROR" app.log | awk '{print $1, $2, $NF}' | sed 's/,//'
这个命令使用 grep
筛选出包含 "ERROR" 的行,然后通过 awk
提取出时间戳和最后一个字段,最后通过 sed
去除可能存在的逗号。
场景三:从文本中提取特定信息
假设有一个文本文件 info.txt
,其中包含了各种信息,你想要提取包含关键字 "Version" 的行,并输出版本号。
grep "Version" info.txt | awk '{print $NF}'
这个命令使用 grep
筛选出包含 "Version" 的行,然后通过 awk
提取出该行的最后一个字段,即版本号。
场景四:筛选包含特定模式的行并添加标签
假设有一个文件 data.txt
,你希望筛选出包含 "important" 的行,并在这些行前面添加标签 "Important: "。
grep "important" data.txt | sed 's/^/Important: /'
这个命令使用 grep
筛选出包含 "important" 的行,然后通过 sed
在每行前面添加 "Important: " 标签。