grep

Linux grep (global regular expression) 命令用于查找文件里符合条件的字符串或正则表达式。

grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。

语法

grep [options] pattern [files]
或
grep [-abcEFGhHilLnqrsvVwxy][-A<显示行数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]

pattern - 表示要查找的字符串或正则表达式。
files - 表示要查找的文件名,可以同时查找多个文件,如果省略 files 参数,则默认从标准输入中读取数据。

常用选项::

-i:忽略大小写进行匹配。
-v:反向查找,只打印不匹配的行。
-n:显示匹配行的行号。
-r:递归查找子目录中的文件。
-l:只打印匹配的文件名。
-c:只打印匹配的行数。
-E : 将样式为延伸的正则表达式来使用。

更多参数说明:

-a : 不要忽略二进制的数据。
-A<显示行数> =<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。
-b : 在显示符合样式的那一行之前,标示出该行第一个字符的编号。
-B:<显示行数> =<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前的内容。
-c : 计算符合样式的列数。
-C<显示行数>=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。
-d <动作> =<动作> : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
-e<范本样式> =<范本样式> : 指定字符串做为查找文件内容的样式。
-f<规则文件> =<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
-F : 将样式视为固定字符串的列表。
-G : 将样式视为普通的表示法来使用。
-h : 在显示符合样式的那一行之前,不标示该行所属的文件名称。
-H : 在显示符合样式的那一行之前,表示该行所属的文件名称。
-i : 忽略字符大小写的差别。
-l : 列出文件内容符合指定的样式的文件名称。
-L : 列出文件内容不符合指定的样式的文件名称。
-n : 在显示符合样式的那一行之前,标示出该行的列数编号。
-o : 只显示匹配PATTERN 部分。
-q : 不显示任何信息。
-r : 此参数的效果和指定"-d recurse"参数相同。
-s : 不显示错误信息。
-v : 显示不包含匹配文本的所有行。
-V : 显示版本信息。
-w : 只显示全字符合的列。
-x --line-regexp : 只显示全列符合的列。
-y : 此参数的效果和指定"-i"参数相同。

实例

1、在文件 file.txt 中查找字符串 "hello",并打印匹配的行:
grep hello file.txt
2、在文件夹 dir 中递归查找所有文件中匹配正则表达式 "pattern" 的行,并打印匹配行所在的文件名和行号:
grep -r -n pattern dir/
3、使用 grep 命令结合正则表达式在文件中进行搜索:

awk

awk 是一种处理文本文件的语言,是一个强大的文本分析工具。

awk 可以逐行读取文本文件,并提供类似编程语言的功能,例如:

变量定义与计算
条件判断与循环
字符串处理与格式化输出
这些特性让 AWK 在处理结构化文本(如 CSV、日志文件)时非常高效。

之所以叫 awk 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。

语法

awk options 'pattern {action}' file

选项参数说明:

options:是一些选项,用于控制 awk 的行为。
pattern:是用于匹配输入数据的模式。如果省略,则 awk 将对所有行进行操作。
{action}:是在匹配到模式的行上执行的动作。如果省略,则默认动作是打印整行。

options 参数说明:

-F <分隔符>: 指定输入字段的分隔符,默认是空格。使用这个选项可以指定不同于默认分隔符的字段分隔符。

-v <变量名>=<值>: 设置 awk 内部的变量值。可以使用该选项将外部值传递给 awk 脚本中的变量。

-f <脚本文件>: 指定一个包含 awk 脚本的文件。这样可以在文件中编写较大的 awk 脚本,然后通过 -f 选项将其加载。

-V : 显示 awk 的版本信息。

-h : 显示 awk 的帮助信息,包括选项和用法示例。

以下是一些常见的 awk 命令用法:

打印整行:
awk '{print}' file
打印特定列:
awk '{print $1, $2}' file
使用分隔符指定列:
awk -F',' '{print $1, $2}' file
打印行数:
awk '{print NR, $0}' file
打印行数满足条件的行:
awk '/pattern/ {print NR, $0}' file
计算列的总和:
awk '{sum += $1} END {print sum}' file
打印最大值:
awk 'max < $1 {max = $1} END {print max}' file
格式化输出:
awk '{printf "%-10s %-10s\n", $1, $2}' file

实例

  1. 有一个文本文件 students.txt,内容格式如下:
    Alice|20|Math
    Bob|22|Physics
    Charlie|21|Chemistry

Image

awk -F "|" ' BEGIN {total_age = 0; count = 0} # 初始化总年龄和计数 {total_age += $2; count++} # 累加年龄,计数+1 END { if (count > 0) { avg = total_age / count; printf "平均年龄:%.2f\n", avg # 保留2位小数 } } ' students.txt
Image

awk -F "|" ' NR == 1 {max_age = $2; max_info = $0} # 第一行初始化最大年龄和信息 NR > 1 { if ($2 > max_age) { # 若当前行年龄更大,更新最大值 max_age = $2; max_info = $0; } } END {print "年龄最大的学生:" max_info} ' students.txt

Image

sed

sed 是一种流编辑器,用于对输入流(文件或管道)进行基本的文本转换。它在处理自动化脚本中的配置文件修改时极其强大。

语法

sed [options] 'command' file

常用命令动作:

a:新增,在当前行后添加一行或多行。
d:删除,删除匹配的行。
i:插入,在当前行前添加一行或多行。
p:打印,通常与 -n 选项一起使用。
s:替换,最常用的功能(例如 s/old/new/g)。

实例

替换配置文件中的 IP 地址:
sed -i 's/127.0.0.1/192.168.1.100/g' config.yaml
删除文件中的空行:
sed -i '/^$/d' file.txt
只查看文件的第 10 到 20 行:
sed -n '10,20p' /var/log/syslog