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 tablesed=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.png
awk
- 介绍
- 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的统计分析