说明
- grep 更适合单纯的查找或匹配文本
- sed 更适合编辑匹配到的文本
- awk 更适合格式化文本,对文本进行较复杂格式处理
grep
参数
- -a 或 --text : 不要忽略二进制的数据。
- -A<显示行数> 或 --after-context=<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。
- -b 或 --byte-offset : 在显示符合样式的那一行之前,标示出该行第一个字符的编号。
- -B<显示行数> 或 --before-context=<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前的内容。
- -c 或 --count : 计算符合样式的列数。
- -C<显示行数> 或 --context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。
- -d <动作> 或 --directories=<动作> : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
- -e<范本样式> 或 --regexp=<范本样式> : 指定字符串做为查找文件内容的样式。
- -E 或 --extended-regexp : 将样式为延伸的正则表达式来使用。
- -f<规则文件> 或 --file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
- -F 或 --fixed-regexp : 将样式视为固定字符串的列表。
- -G 或 --basic-regexp : 将样式视为普通的表示法来使用。
- -h 或 --no-filename : 在显示符合样式的那一行之前,不标示该行所属的文件名称。
- -H 或 --with-filename : 在显示符合样式的那一行之前,表示该行所属的文件名称。
- -i 或 --ignore-case : 忽略字符大小写的差别。
- -l 或 --file-with-matches : 列出文件内容符合指定的样式的文件名称。
- -L 或 --files-without-match : 列出文件内容不符合指定的样式的文件名称。
- -n 或 --line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。
- -o 或 --only-matching : 只显示匹配PATTERN 部分。
- -q 或 --quiet或--silent : 不显示任何信息。
- -r 或 --recursive : 此参数的效果和指定"-d recurse"参数相同。
- -s 或 --no-messages : 不显示错误信息。
- -v 或 --invert-match : 显示不包含匹配文本的所有行。
- -V 或 --version : 显示版本信息。
- -w 或 --word-regexp : 只显示全字符合的列。
- -x --line-regexp : 只显示全列符合的列。
- -y : 此参数的效果和指定"-i"参数相同。
实例
# 在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行
grep test *file
# 查找前缀有 test 的文件包含 test 字符串的文件
grep test test*
# 以递归的方式查找 etc/acpi 下包含 update 的文件
grep -r update /etc/acpi
# 查找文件名中包含 test 的文件中不包含 test 的行
grep -v test *test*
# 查询包含INFO的行,以及其前后7行
grep -A 7 -B 7 'INFO' demo.log
# 输出文件demo.log中查找所有包行ERROR的行的数
grep -c 'ERROR' demo.log
sed
参数:
- -f script文件 或 --file=script文件 以选项中指定的script文件来处理输入的文本文件。
- -h或--help 显示帮助。
- -n或--quiet或--silent 仅显示script处理后的结果。
- -V或--version 显示版本信息。
- -i 直接修改源文件
动作说明
- a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
- c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
- d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
- i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
- p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
- s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!
实例
# 替换 test.txt 中所有的 abc 为 def
sed -i 's/abc/def/g' test.txt
# 替换 test.txt 中第二个 abc 为 def
sed -i 's/abc/def/2' test.txt
# w 标记会将匹配后的结果保存到 test1.txt
sed 's/test/trial/w test1.txt' test.txt
# 删除所有行
sed 'd' test.txt
# 删除第 3 行
sed '2d' test.txt
# 删除第 1,3 行
sed '1,3d' test.txt
# 删除 1 到 3 行
sed '/1/,/3/d' test.txt
# 删除 test.txt 文件内容中第 3 行开始的所有的内容
sed '3,$d' test.txt
# 插入到第 3 行,原来的第 3 行会变成第 4 行
sed '3i This is an inserted line.' test.txt
# 插入到第 3 行后面,原来的第 4 行会变成第 5 行
sed '3a This is an inserted line.' test.txt
# 替换第三行
sed '3c This is an inserted line.' test.txt
# 转换所有匹配的字符, 1->7 , 2->8 , 3->9
sed 'y/123/789/' test.txt
# 把 test1.txt 文本的数据插入到 test.txt 第三行后面
sed '3r test1.txt' test.txt
# 把test1.txt 文本的数据插入到 test.txt 末尾
sed '$r test1.txt' test.txt
awk
常用参数
- -F fs or --field-separator fs 指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。
- -v var=value or --asign var=value 赋值一个用户定义变量。
- -f scripfile or --file scriptfile 从脚本文件中读取awk命令。
- -W version or --version 打印bug报告信息的版本。
实例
# 行匹配语句 awk '' 只能用单引号
awk '{[pattern] action}' {filenames}
# 每行按空格或 TAB 分割,输出文本中的 1、4 项
awk '{print $1,$4}' log.txt
# 使用","分割 输出文本中的 1、2 项
awk -F, '{print $1,$2}' log.txt
# 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割
awk -F '[ ,]' '{print $1,$2,$5}' log.txt
# 设置变量,输出第 1 2 项
awk -va=1 '{print $1,$1+a}' log.txt
# 使用脚本
awk -f {awk脚本} {文件名}
# 过滤第一列大于 2 的行
awk '$1>2' log.txt
# 过滤第一列等于 2 的行
awk '$1==2 {print $1,$3}' log.txt
# 过滤第一列大于 2 并且第二列等于 Are 的行
awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt
# 指定输出分割符
awk '{print $1,$2,$5}' OFS=" $ " log.txt
# 输出第二列包含 "th",并打印第二列与第四列
awk '$2 ~ /th/ {print $2,$4}' log.txt
# 输出包含 "re" 的行,跟 grep 效果一样
awk '/re/ ' log.txt
# 忽略大小写
awk 'BEGIN{IGNORECASE=1} /this/' log.txt
# 第二项不包含 th 的行
awk '$2 !~ /th/ {print $2,$4}' log.txt