===================================
-
grep根据内容检索文件
- grep keyword -i -r /home/jck28xxxx 检索某个文件加下匹配关键字的文档路径和内容行,-i忽略大小写
- grep keyword -i file_name 检索某个文件匹配关键字的内容行,-i忽略大小写
- grep keyword -v file_name 检索某个文件不匹配关键字的内容,-v invert反转,显示不匹配的内容行
- grep keyword -A2 file_name 检索某个文件匹配关键字的内容行以及下2行,“-A”+数字
- grep keyword -B1 file_name 检索某个文件匹配关键字的内容行以及前1行,“-B”+数字
- grep keyword -C1 file_name 检索某个文件匹配关键字的内容行以及前后各1行,“-C”+数字
官方文档: https://www.gnu.org/software/grep/manual/grep.html
==================================
-
awk语法十分复杂,但是总体是’pattern {action}'结构
-
语法大概介绍
- 字段分隔符 FS:默认值是空格,当你输入的内容中包含空格,按照默认的FS,可以读取为多个字段;
- 输出数据的字段分隔符 OFS:默认为空格
- 记录分隔符 RS:默认值是新行,也就是你的输入内容多行,默认会被读取为多个记录;
- 输出字段的行分隔符 ORS: 默认也是新行,调用print输出会把多个记录按照一行一行的形式输出,当然你可以自定义为其他的符号;
- 行数/记录数 NR:已经读出的记录数;
-
Detail语法介绍
- 字段与字段数 $1 $2 … $NF NF
- $0 代表当前的记录
- $1 代表第一个字段
- $N 代表第 N 个字段
- $NF 代表最后一个字段
- $(NF-1) 代表倒数第二个字段
- 开始和结束 awk ‘BEGIN{}END{}’
- 正则匹配整行匹配 awk ‘/Running/’
- 字段匹配 awk ‘$2~/xxx/’
- 行数表达式取第二行 awk ‘NR==2’
- 去掉第一行 awk ‘NR>1’
- 区间选择
awk ‘/aa/,/bb/’
awk ‘/1/,NR==2’
-
根据语法解读不同的代码段
-
代码段1
echo '1
2
3’ | awk ‘BEGIN{ORS=“:”}{$1=$1;print $0}’
1:2:3:
解读NOTE: echo语句内容三行,按照默认的RS行,读取为多个记录,ORS输出记录被重新定义为“:”,调用输出语句时候,输出就出现在一行里面; -
代码段2
echo '1,10
2,20
3,30’ | awk ‘BEGIN{total=0;FS=“,”}{total+=$2}END{print total/NR}’
20码
解读NOTE: echo语句中多行,被解读为多条记录,每一行都有空格,可以解读为多个字段,$2读取第二个字段,total为第二个字段的和,NR是已经读取的记录数,此段为求平均值; -
代码段3
echo 'a, 1, 10
a, 2, 20
a, 3, 30
b, 1, 5
b, 2, 6
b, 3, 7’ | awk '{data[$1]+=$3}
END{for(k in data) print k,data[k]}’
a, 60
b, 18
解读NOTE:
统计多家机构的营业额 -
代码段4
echo 'a, 1, 10
a, 2, 20
a, 3, 30
b, 1, 5
b, 2, 6
b, 3, 7’ | awk '{data[$1]+=$3;count[$1]+=1;}
END{for(k in data) print k,data[k]/count[k]}’
a, 20
b, 6
解读NOTE:
统计多家机构的营业额平均值
-
-
官方文档:https://www.gnu.org/software/gawk/manual/gawk.html
======================
- sed的语法结构 [addr]X[options], 跟awd有点接近,sed的特别之处是可以修改文本,用的最多的就是查找替换
- pattern表达式语法介绍
- -e 表达式
- sed -n ‘2p’ 打印第二行
- sed ‘s#hello#world#’ 修改
- -i 直接修改源文件
- -E 扩展表达式
- –debug 调试
- 行数与行数范围 20 30,35
- 正则匹配 /pattern/
- 区间匹配 //,//
- action表达式语法介绍
- 打印,通常结合-n 参数:sed -n ‘2p’
- s 查找替换:
s/REGEXP/REPLACEMENT/[FLAGS]
- d 删除,删除前两行 sed ‘1,2d’
- a 追加
- c 改变
- i 插入内容到匹配行之前
- e 执行命令
- 分组匹配与字段提取:
sed ‘s#([0-9]*)|([a-z]*)#\1 \2#’
- 部分代码段解读
- 打印特定行
sed -n 2p
- 删除最后一行
sed $d
-
echo a:b:c | sed 's/:/123&/'
==>输出结果:a123:b:c
-
echo a:b:c | sed 's/:/&123/'
==>输出结果:a:123b:c
-
echo a:b:c | sed 's#:#|#g'
==>输出结果:a|b|c
-
NOTE:
s 表示替换
s 后面的追加字符可以为任意字符
g 表示全局匹配
& 表示匹配内容
-
NOTE:
-
echo 0 1 2 3 4 | sed -E 's#([1-3]) ([1-3]) ([1-3])#\3 \2 \1#'
==>输出结果:0 3 2 1 4
-
NOTE:
使用()对数据进行分组
使用\1 \2 反向引用分组,&代表符合匹配的完整结果,\1代表分组后的第一个分组,\2是第二个分组
-
NOTE:
-
sed '/pattern/i addContent' file_name
==>i 插入内容到匹配行之前 - -i直接修改源文件,对文件内容进行查找替换 sed -i ‘s#orignal#target#g’ file_name
- 不修改源文件,查找替换后输出结果,不改源文件 sed ‘s#orignal#target#g’ file_name
- 打印特定行
- pattern表达式语法介绍
官方文档: https://www.gnu.org/software/sed/manual/sed.html