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.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
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的词典结构
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统计分析
- 数据文件修改
网友评论