Bootstrap

Linux命令之三剑客:grep、sed和awk用法详解

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命令的高级用法:

  1. grep -v 反选,打印不匹配的行

  2. grep -i 忽略大小写

  3. grep -E 支持扩展正则表达式

  4. grep -w 只匹配整个词

  5. grep -A 3 打印匹配行及其后3行

  6. grep -B 3 打印匹配行及其前3行

  7. grep -C 3 打印匹配行及周围3行

  8. grep -n 打印匹配行及行号

  9. grep -c 只打印匹配的行数

  10. grep -l 只打印包含匹配的文件名

  11. grep -L 打印不包含匹配的文件名

  12. grep ‘^test’ 匹配以test开头的行

  13. grep ‘test$’ 匹配以test结尾的行

  14. grep ‘test\b’ 精确匹配test这个词

  15. grep ‘[0-9]’ 匹配包含数字的行

  16. grep -r recursively grep(递归搜索)

  17. grep -o 只显示匹配的内容

  18. grep -P 支持Perl语法的正则表达式

  19. grep -F 将搜索模式视为固定字符串而非正则表达式

  20. 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命令的高级用法:

  1. sed -i 直接修改文件内容

  2. sed -n 只打印处理后的结果

  3. sed ‘/正则式/!d’ 匹配正则式以外的行

  4. sed -e 允许多个编辑命令

  5. sed -f scriptfile 批量执行sed命令

  6. sed -r 支持扩展正则表达式

  7. sed ‘s/old/new/g’ 替换(g表示全局替换)

  8. sed ‘2,5d’ 删除2-5行

  9. sed -z 用NUL字符作为行分隔符

  10. sed -r ‘s/(正则式)/替换内容/’ 基于模式匹配替换

  11. sed ‘s/$/结尾/’ 在每行结尾处插入内容

  12. sed ‘5i\新内容’ 在第5行前插入内容

  13. sed -e ‘s/1/01/; s/2/02/’ 串联执行多条命令

  14. sed -e ‘/正则1/{动作1};/正则2/{动作2}’ 根据模式执行不同动作

  15. sed -r ‘s/([0-9]+)/(\1)/g’ 在数字周围加括号

  16. sed = filename 输出行号

  17. sed -r ‘s/^/Header:/’ 在每行前加上Header:

  18. sed ‘1!G;h;$!d’ 打印文件两列输出

  19. sed -r ‘s/([0-9]{3})/(\1) /g’ 在数字中间插入空格

  20. 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的高级用法:

  1. 数组处理 - awk ‘{array[$1]++} END{for(i in array) print i, array[i]}’

  2. 字符串处理 - awk ‘{gsub(/linux/,“Linux”)}1’

  3. 模式匹配 - awk ‘/linux/{print $1}’

  4. 流程控制 - awk ‘{if($1>10) print $0}’

  5. 数学运算 - awk ‘{x = $1 / $2; print x}’

  6. 格式化输出 - awk ‘{printf “%-10s %s\n”, $1, $2}’

  7. 统计行数 - awk ‘END {print NR}’

  8. 读取文件 - awk ‘{while (getline < “file”) print $0}’

  9. 系统命令 - awk ‘{system("ls "$1)}’

  10. 重定向输出 - awk ‘{print > “output”}’

  11. 排序 - awk ‘{print $0 | “sort”}’

  12. 时间处理 - awk ‘{print strftime(“%Y%m%d”)}’

  13. 连接字段 - awk ‘{print $1 $2 $3}’

  14. 自定义函数 - awk ‘{square($1)}; function square(x) {print x*x}’

  15. 处理多个文件 - awk ‘{print FILENAME, $0}’ *.txt

  16. 设置字段分隔符 - awk -F ‘:’ ‘{print $1}’

  17. 匹配行前后 - awk ‘/start/,/end/’

  18. 循环读取文件 - awk ‘{while(getline<“file”) print $0}’

  19. 统计单词数 - awk ‘{count+=NF}; END{print count}’

  20. 排除注释行 - awk ‘!/^#/{print $0}’

4. awk 中有一些默认变量,在程序中可以直接使用:

  1. NR:表示记录数量,即当前处理的行号。

  2. NF:表示字段数量,即当前行的字段个数。

  3. FS:字段分隔符,默认是空格和tab。

  4. RS:记录分隔符,用于分隔记录,默认是换行符。

  5. OFS:输出字段分隔符,用于打印时分隔字段,默认也是空格。

  6. ORS:输出记录分隔符,用于打印时分隔记录,默认是换行符。

  7. FILENAME:当前文件名。

  8. FNR:各文件分别计数的行号。

  9. ARGC:命令行参数个数。

  10. ARGV:数组,保存的是命令行参数。

下面是一个利用 NR 变量打印行号的示例:

awk '{print NR, $0}' file

NR 在开始处理下一个文件时会被重置为 0。

熟悉这些默认变量,可以简化 awk 程序的编写。需要在编程中多加运用。

综上,掌握grep、sed和awk三个命令的用法,能大大提升我们在Linux下处理文本的效率。需要多练习来熟悉它们的语法。

;