Linux命令之三剑客:grep、sed和awk用法详解
Linux系统下,grep、sed和awk三个命令被称为“三剑客”,它们都是非常强大的文本处理工具。 掌握它们的用法,可以大大提高我们在Linux下处理文本的效率。下面我会详细介绍这三个命令的语法及示例。
一、grep命令
grep命令用来在文件内搜索字符串模式并打印匹配行。
1. 基本语法
grep [选项] ‘搜索模式’ 文件名
2. 示例
- 搜索字符串"linux"在testfile文件内的匹配行
grep ‘linux’ testfile
- 不区分大小写搜索
grep -i ‘linux’ testfile
- 显示匹配行及行号
grep -n ‘linux’ testfile
- 只输出不匹配的行
grep -v ‘linux’ testfile
- 递归搜索当前目录下所有文件中的匹配行
grep -R ‘linux’ .
- 统计匹配的行数
grep -c ‘linux’ testfile
3. 这里列举20条grep命令的高级用法:
-
grep -v 反选,打印不匹配的行
-
grep -i 忽略大小写
-
grep -E 支持扩展正则表达式
-
grep -w 只匹配整个词
-
grep -A 3 打印匹配行及其后3行
-
grep -B 3 打印匹配行及其前3行
-
grep -C 3 打印匹配行及周围3行
-
grep -n 打印匹配行及行号
-
grep -c 只打印匹配的行数
-
grep -l 只打印包含匹配的文件名
-
grep -L 打印不包含匹配的文件名
-
grep ‘^test’ 匹配以test开头的行
-
grep ‘test$’ 匹配以test结尾的行
-
grep ‘test\b’ 精确匹配test这个词
-
grep ‘[0-9]’ 匹配包含数字的行
-
grep -r recursively grep(递归搜索)
-
grep -o 只显示匹配的内容
-
grep -P 支持Perl语法的正则表达式
-
grep -F 将搜索模式视为固定字符串而非正则表达式
-
grep --color 高亮显示匹配内容
熟练掌握这些技巧,可以大大提升grep的使用能力,在数据处理和日志分析中发挥很大作用。
二、sed命令
sed命令是一个流编辑器,可以对 stdin 或文件进行处理。
1. 基本语法
sed [选项] ‘命令’ 文件名
2. 示例
- 将testfile文件的内容替换成newcontent
sed -i ‘s/testfile/newcontent/’ testfile
- 删除testfile文件第3行内容
sed -i ‘3d’ testfile
- 在testfile第1行前插入newLine
sed -i ‘1i newLine’ testfile
- 将testfile文件中linux替换为Linux
sed -i ‘s/linux/Linux/g’ testfile
- 只打印testfile文件中第3-6行内容
sed -n ‘3,6p’ testfile
3. 这里列出20条sed命令的高级用法:
-
sed -i 直接修改文件内容
-
sed -n 只打印处理后的结果
-
sed ‘/正则式/!d’ 匹配正则式以外的行
-
sed -e 允许多个编辑命令
-
sed -f scriptfile 批量执行sed命令
-
sed -r 支持扩展正则表达式
-
sed ‘s/old/new/g’ 替换(g表示全局替换)
-
sed ‘2,5d’ 删除2-5行
-
sed -z 用NUL字符作为行分隔符
-
sed -r ‘s/(正则式)/替换内容/’ 基于模式匹配替换
-
sed ‘s/$/结尾/’ 在每行结尾处插入内容
-
sed ‘5i\新内容’ 在第5行前插入内容
-
sed -e ‘s/1/01/; s/2/02/’ 串联执行多条命令
-
sed -e ‘/正则1/{动作1};/正则2/{动作2}’ 根据模式执行不同动作
-
sed -r ‘s/([0-9]+)/(\1)/g’ 在数字周围加括号
-
sed = filename 输出行号
-
sed -r ‘s/^/Header:/’ 在每行前加上Header:
-
sed ‘1!G;h;$!d’ 打印文件两列输出
-
sed -r ‘s/([0-9]{3})/(\1) /g’ 在数字中间插入空格
-
sed -r ‘s/(.{5})/\1\n/g’ 每5个字符插入换行
多练习这些用法,可以大大提高sed的使用能力。
三、awk命令
awk是一个强大的文本处理程序,适合格式化和分析数据。
1. 基本语法
awk [选项] ‘条件 { 动作 }’ 文件名
2. 示例
- 打印testfile的第3列
awk ‘{print $3}’ testfile
- 按空格分割testfile并输出行数
awk ‘{print NF}’ testfile
- 求testfile第2列的平均值
awk ‘{sum+=$2} END {print sum/NR}’ testfile
- 查找testfile中含linux的行并打印这些行
awk ‘/linux/{print $0}’ test
- 统计testfile中空行个数
awk ‘/^$/{count++} END{print count}’ testfile
3.这里列举20条awk的高级用法:
-
数组处理 - awk ‘{array[$1]++} END{for(i in array) print i, array[i]}’
-
字符串处理 - awk ‘{gsub(/linux/,“Linux”)}1’
-
模式匹配 - awk ‘/linux/{print $1}’
-
流程控制 - awk ‘{if($1>10) print $0}’
-
数学运算 - awk ‘{x = $1 / $2; print x}’
-
格式化输出 - awk ‘{printf “%-10s %s\n”, $1, $2}’
-
统计行数 - awk ‘END {print NR}’
-
读取文件 - awk ‘{while (getline < “file”) print $0}’
-
系统命令 - awk ‘{system("ls "$1)}’
-
重定向输出 - awk ‘{print > “output”}’
-
排序 - awk ‘{print $0 | “sort”}’
-
时间处理 - awk ‘{print strftime(“%Y%m%d”)}’
-
连接字段 - awk ‘{print $1 $2 $3}’
-
自定义函数 - awk ‘{square($1)}; function square(x) {print x*x}’
-
处理多个文件 - awk ‘{print FILENAME, $0}’ *.txt
-
设置字段分隔符 - awk -F ‘:’ ‘{print $1}’
-
匹配行前后 - awk ‘/start/,/end/’
-
循环读取文件 - awk ‘{while(getline<“file”) print $0}’
-
统计单词数 - awk ‘{count+=NF}; END{print count}’
-
排除注释行 - awk ‘!/^#/{print $0}’
4. awk 中有一些默认变量,在程序中可以直接使用:
-
NR:表示记录数量,即当前处理的行号。
-
NF:表示字段数量,即当前行的字段个数。
-
FS:字段分隔符,默认是空格和tab。
-
RS:记录分隔符,用于分隔记录,默认是换行符。
-
OFS:输出字段分隔符,用于打印时分隔字段,默认也是空格。
-
ORS:输出记录分隔符,用于打印时分隔记录,默认是换行符。
-
FILENAME:当前文件名。
-
FNR:各文件分别计数的行号。
-
ARGC:命令行参数个数。
-
ARGV:数组,保存的是命令行参数。
下面是一个利用 NR 变量打印行号的示例:
awk '{print NR, $0}' file
NR 在开始处理下一个文件时会被重置为 0。
熟悉这些默认变量,可以简化 awk 程序的编写。需要在编程中多加运用。
综上,掌握grep、sed和awk三个命令的用法,能大大提升我们在Linux下处理文本的效率。需要多练习来熟悉它们的语法。