Linux三剑客
grep + awk + sed
grep
❖global search regular expression(RE) and print out the line
❖基于正则表达式查找满⾜条件的⾏
awk
❖名字来源于三个作者的名字简称
❖根据定位到的数据⾏处理其中的分段
sed
❖stream editor
❖根据定位到的数据⾏修改数据
三剑客
❖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 # 若没有file则从读取标准输入,把匹配到的整行内容打印出来
grep -i pattern file 忽略⼤⼩写
grep -v pattern file 不显⽰匹配的⾏
grep -o pattern file 把每个匹配的内容⽤独⽴的⾏显⽰
grep -E pattern file 使⽤扩展正则表达式
grep -A -B -C pattern file 打印命中数据的上下⽂ grep -A1 aa file1 (A1上一行,B1下一行,C1上下一行)
grep pattern -r dir/ 递归搜索,grep aa -r ./ 输出为./下所有包含aa的内容的文件
pattern正则表达式:要用单引号,单引号比双引号好。
基本表达式(BRE)
❖^ 开头 $结尾
❖[a-z] [0-9] 区间,如果开头带有^表⽰不能匹配区间内的元素
❖* 0个或多个
❖. 表⽰任意字
基本正则(BRE)与扩展正则的区别(ERE)
❖ ? ⾮贪婪匹配
❖+ ⼀个或者多个
❖() 分组
❖{} 范围约束
想要只输出AliYunDun的进程:
扩展正则的使用:
cat a.txt | grep -E '(23,24)' # 单引号防止被转义
curl 发起网址请求:
curl 'https://www.baidu.com'
awk介绍
❖Awk是linux下的⼀个命令,同时也是⼀种语⾔解析引擎
❖Awk具备完整的编程特性。⽐如执⾏命令,⽹络请求等
❖精通awk,是⼀个linux⼯作者的必备技能语法
❖awk 'pattern{action}'
awk理论上可以代替grep
❖awk 'pattern{action}'
❖awk 'BEGIN{}END{}' 开始和结束
❖awk '/Running/' 正则匹配 awk '/abc/' a.txt
❖awk '/aa/,/bb/' 区间选择
❖awk '$2~/xxx/' 字段匹配
❖awk 'NR==2' 取第⼆⾏
❖awk 'NR>1' 去掉第⼀⾏
-F:指定分隔符,默认空格为分隔符
echo '1 2 3' | awk -F '2' '{print $2}' # 以2为分隔符,打印第二个元素=》 3
OFS:指定输出数据的分隔符
echo '1 2 3' | awk '{OFS="-"}{print $1,$2,$3}' #结果1-2-3
NR :记录数
awk 'NR>1' 2.txt | less # 打印第二行开始的内容
NF:最后一个
echo '1 2 3' | awk '{OFS="-"}{print $NF}' #结果3 还可以(NF-1),倒数第二个
$0:当前的所有字段
RS:记录分隔符 把一行拆成多行
echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/23760743/.local/bin:/home/23760743/bin
echo $PATH | awk 'BEGIN{RS=":"}{print $0}'
/usr/local/bin
/usr/bin
/usr/local/sbin
/usr/sbin
/home/23760743/.local/bin
/home/23760743/bin
ORS:把多行合为一行
echo $PATH | awk 'BEGIN{RS=":"}{print $0}' | awk 'BEGIN{ORS=":"}{print $0}'
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/23760743/.local/bin:/home/23760743/bin:
\:转义符号
awk还可以用来数据统计
sed:用来更改数据
echo '1
2
3' | sed 's/2/xxxx/' # s表示要替换的意思,这里/换成#也可以
返回结果
1
xxxx
3
-e:表示可以多次替换的意思
echo '1
2
3' | sed -e 's#2#xxxx#' -e 's/3/3333/'
1
xxxx
3333
echo 123423 | sed 's/2/B/g' # g是把所有2都替换
1B34B3