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 命令结合正则表达式在文件中进行搜索:
- 在文件 example.txt 中查找所有包含数字的行。
- 在文件 example.txt 中查找所有以 http:// 或 https:// 开头的 URL 地址。
grep '[0-9]' example.txt
grep -E '^https?://' example.txt
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
实例
- 有一个文本文件 students.txt,内容格式如下:
Alice|20|Math
Bob|22|Physics
Charlie|21|Chemistry
- 使用 awk以 “|” 为分隔符,打印出每个学生的姓名和专业。
计算所有学生的平均年龄。
找出年龄最大的学生信息。
awk -F "|" '{print "姓名:" $1 ", 专业:" $3}' students.txt
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
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
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