Linux三剑客 grep+awk+sed
2021-08-04 本文已影响0人
InsaneLoafer
Linux三剑客介绍
- grep
- global search regular expression(RE) and print out the line
- 基于正则表达式查找满足条件的行
- awk
- 名字来源于三个作者的名字简称
- 根据定位到的数据行处理其中的分段
- sed
- stream editor
- 根据定位到的数据行修改数据
Linux三剑客的价值
- 三剑客
- grep 数据查找定位
- awk 数据切片
- sed 数据修改
- 类比SQL
grep= select * from table like '%xx'
awk=select field from table
sed=update table set field=new where field=old
grep
grep pattern file
-
grep -i pattern file
忽略大小写 -
grep -v pattern file
不显示匹配的行 -
grep -o pattern file
把每个匹配的内容用独立的行显示 -
grep -E pattern file
使用扩展正则表达式 -
grep -A -B -C pattern file
打印命中数据的上下文 -
grep pattern -r dir/
递归搜索
BRE基本正则表达式
-
^
开头$
结尾 -
[a-z] [0-9]
区间,如果开头带有^
表示不能匹配区间内的元素 -
*
0个或多个 -
.
表示任意字符
ERE扩展正则表达式
- 基本正则表达式(BRE)基础上的扩展
-
?
非贪婪匹配 -
+
一个或者多个 -
()
分组 -
{}
范围约束 -
|
匹配多个表达式的任何一个
ERE开启方法
image.pngawk
- 介绍
- Awk是linux下的一个命令,同时也是一种语言解析引擎
- Awk具备完整的编程特性。比如执行命令,网络请求等
- 精通awk,是一个linux工作者的必备技能语法
awk 'pattern{action}'
awk pattern语法
- awk理论上可以代替grep
awk 'pattern{action}'
-
awk 'BEGIN{}END{}'
开始和结束 -
awk '/Running/'
正则匹配 -
awk '/aa/,/bb/'
区间选择 -
awk '$2~/xxx/'
字段匹配 -
awk 'NR==2'
取第二行 -
awk 'NR>1'
去掉第一行
awk内置变量
-
FS
字段分隔符 -
OFS
输出数据的字段分隔符 -
RS
记录分隔符 -
ORS
输出字段的行分隔符 -
NF
字段数 -
NR
记录数
awk的字段数据处理
-
-F
参数指定字段分隔符 -
BEGIN{FS="_"}
也可以表示分隔符 -
$0
代表当前的记录 -
$1
代表第一个字段 -
$N
代表第N个字段 -
$NF
代表最后一个字段 -
$(NF-1)
代表倒数第二个字段
awk字段分割
echo $PATH | awk 'BEGIN{RS=":"}{print $0}' | awk -F/ '{print $1,$2,$3,$4}'
echo $PATH | awk 'BEGIN{RS=":"}{print $0}' | awk 'BEGIN{FS="/"}{print $1,$2,$3,$4}'
echo $PATH | awk 'BEGIN{RS=":"}{print $0}' | awk 'BEGIN{FS="/ | -"}{print $1,$2,$3,$4}'
image.png
- 修改OFS和ORS让$0重新计算
echo $PATH | awk 'BEGIN{FS=":";OFS=" | "}{$1=$1;print $0}'
echo $PATH | awk 'BEGIN{RS=":";ORS="^"}{print $0}'
image.png
awk行处理
- 把单行分拆为多行
echo $PATH | awk 'BEGIN{RS=":"}{print $0}'
echo $PATH | awk 'BEGIN{RS=":"}{print NR,$0}'
echo $PATH | awk 'BEGIN{RS=":"}END{print NR}'
image.png
- 多行组合为单行
echo $PATH | awk 'BEGIN{RS=":"}{print $0}' | awk 'BEGIN{ORS=":"}{print $0}'
image.png
数据计算
echo '1,10
2,20
3,30' | awk 'BEGIN{a=0;FS=","}{a+=$2}END{print a/NR}'
image.png
awk的词典结构
- 提取包含”9”但是并不包含”study”的记录
awk -F, '
/9/{if(member[$1]!=1) d[$1]=$0}
/study/{member[$1 ]=1; delete d[$1]}
END{for(k in d) print d[k]}
'file
sed
sed [addr ]X[options]
-
-e
表达式 -
sed -n '2p'
打印第二行 -
sed 's#hello#world#'
修改 -
-i
直接修改源文件 -
-E
扩展表达式 -
--debug
调试
pattern
- 20 30,35行数与行数范围
-
/pattern/
正则匹配 -
//,//
正则匹配的区间,第一个表示开始命中,第二个表示结束命中,类似开闸放水
act1011
-
d
删除 -
p
打印,通畅结合-n
参数:sed -n '2p'
- 查找替换::
s/REGEXP/REPLACEMENT/[FLAGS]
- 分组匹配与字段提取:
sed 's#([0-9]*)|([a-z]*)#\1\2#'
sed使用
echo $PATH | awk 'BEGIN{RS=":"}{print $0}' | sed 's#/#----#g'
echo $PATH | awk 'BEGIN{RS=":"}{print $0}' | sed -n '/^\ /bin/,/sbin/p'
sed -i '.bak' -e " -e "
三剑客实战
- 日志数据检索
- 找出log中的404 500的报错考察严谨性
- 找出500错误时候的上下文考察grep高级用法
-日志数据统计 - 找出访问量最高的ip统计分析
- 数据文件修改
- 找出访问量最高的页面地址借助于sed的统计分析