写点什么

Linux 三剑客 grep、sed、awk 以及正则表达式

作者:A-刘晨阳
  • 2022-11-02
    北京
  • 本文字数:2331 字

    阅读完需:约 8 分钟

❀grep sed awk 命令以及正则表达式


grep

语法:


grep 【选项】 '内容' 文件名



正则表达式:


基础正则表达式 -->grep 可以直接使用 $ 以...结尾^ 以...开头. 匹配任意一个字符- 匹配前一个字符或子表达式任意次(例如:grep "g.d" a.txt(过滤 a.txt 文件中的以 g 开头以 d 结尾可以代表有任意多个字符或没有字符))[A-Z] [a-z] [0-9] [A-Za-z0-9][^a-z] 取反


扩展正则表达式 egrep =grep -E{n,m} 匹配前一个字符或子表达式 n 到 m 次{n, } 匹配前一个字符或子表达式最少 n 次{ ,m} 匹配前一个字符或表达式最少 m 次{n} 匹配前一个字符或子表达式 n 次


+ 匹配前一个字符或子表达式 1 次以上(*包括 0+不包括,至少)? 匹配前一个字符或子表达式 0 次或 1 次以上| 或 () 分组(例如:(g|f)ood)


\ 转义,取消一个字符的特殊含义


想要查看更多的正则表达式就去👉正则表达式(全)👈


查找/root 这层目录有多少个普通文件? find ./ -maxdepth 1 -type f ! -name ".*" | wc -l | ll | grep -c "^_"


sed

语法:


sed [选项] ‘[操作地址]sed 内置操作’ 文件


常用选项



操作地址



举例:


sed -n '2p' a.txt 打印第二行 (2)sed -n '2,5p' a.txt 打印第二行到第五行(2,3,4,5)sed -n '2p;5p' a.txt 打印第二行和第五行(2,5)sed -n '3,$p' a.txt 打印第三行到最后一行(3,4,5,6,7,8,9,10)sed -n '1~2p' a.txt 打印指定步长为 2,所以打印的是 1、3、5、7......行 (1,3,5,7,9)sed -n '1,+2p' a.txt 打印第 1 行到第 1+2 行,也就是 1 到 3 行(1,2,3)


内置操作



举例:


sed -i '2a abcabc' a.txt 修改文件 sed '2a abcabc' a.txt 输出一下但不修改文件 sed '3d' a.txt 删除第三行 sed 's/abc/ABC/g' a.txt 把 a.txt 中的所有 abc 修改成 ABCsed -n 'n,p' a.txt(2,4,6,8,10)sed -n 'N,p' a.txt(1,2,3,4,5,6,7,8,9,10)sed '3r a.txt' b.txt 把 a.txt 里面的数据放到 b.txt 的第三行的后面 sed '3,5w a.txt' b.txt 把 a.txt 的第三行到第五行放到 b.txt 里面 sed -n '3!p' a.txt 除了第三行其他都打印出来


在 sed 内置操作前加!,表示除了指定地址外,其余行执行该命令 s 替换的两个特殊用法 &和\1


使用正则:/字符或表达式/想要查看更多的正则表达式就去👉正则表达式(全)👈


echo "http://www.baidu.com/1.mp3" | sed -r 's#(.)//(.)/(.*)#\2#'


awk

语法:


awk [选项] ‘BEGIN{command}匹配模式{command}END{command}’ 文件


执行流程:


执行 BEGIN{commands}语句块中的语句; 从文件或标准输入中读取第 1 行; 如果没有匹配模式,则执行{}中的语句;若有匹配模式,则检查该整行与匹配模式是否匹配; 若匹配, 则执行{}中的语句;若不匹配则不执行{}中的语句,接着读取下一行;重复这个过程, 直到所有行被读取完毕; 执行 END{commands}语句块中的语句。


awk 格式书写:


awk 的指令一定要用单引号括起 awk 的动作一定要用花括号括起匹配模式可以是正则表达式、条件表达式或两种组合如果模式是正则表达式要用/做分割符多个动作之间用;号分开


内置操作



awk 进阶用法(内置)举例:


awk 'END{print FILENAME}' dName.txt 输出文件名加个 END 输出一个文件名,否则文件有多少行就输出多少个文件名 awk 'END {print ENVIRON["PATH"]}' dName.txt 掉用系统中的环境变量 head -1 a.txt | awk 'BEGIN{OFS="-"}{print 2}' 查看 a.txt 第一行,用内置分隔符 OFS 指定以-分割(1.1.1.1-11)head -1 a.txt | awk 'BEGIN{ORS="-"}{print 2}' 查看 a.txt 第一行,用内置分隔符 ORS 指定以-在最后面分割(1.1.1.1 11-)awk 'length($0)==2 {print}' h.txt 如果 h.txt 里面有长度等于 2 的就输出 echo "abc123abc" | awk '{print toupper($0)}' 把 abc 换成 ABCecho "ABC123ABC" | awk '{print tolower($0)}' 把 ABC 换成 abc



举例:


awk -F ":" 'END {print NR}' /etc/passwd 打印一共有多少行 awk -F ":" 'NR==3{print}' /etc/passwd 打印第三行 awk -F ":" 'NR==3 {print $2}'/etc/passwd 打印第三行第二段,以:为分隔符 awk 'NR<=3 {print }' /etc/passwd 打印前三行 awk 'NR==3||NR==5 {print }' /etc/passwd 打印第三行和第五行


时间函数:strftime()时间 systime()时间戳


awk 'BEGIN {print strftime()}' 输出年月日时分秒(四 3 月 3 09:35:34 CST 2022)awk 'BEGIN {print strftime("%Y")}'输出年(2022)awk 'BEGIN {print strftime("%F")}'输出年月日(2022-03-03)awk 'BEGIN {print strftime("%T")}' 输出时分秒(09:36:16)awk 'BEGIN {print systime()}' 输出时间戳(1646271406)


awk 运算:


echo a | awk '{print 1/3}' 小数 (0.33333)echo a | awk 'print int(1/3)' 整数(0)echo a | awk '{print int (1/3*100)}'向小数点后面移两位(33)


占位符:



字符串格式化输出:


echo a | awk '{printf "使用率为 %.2f\n",(1/3)}' 输出(使用率为 0.33)echo a | awk '{printf "使用率为 %d\n",(1/3)}' 输出(使用率为 0) echo a | awk '{printf "使用率为 %s\n","xiaoming"}' 输出(使用率为 xiaoming)


查看内存占用率:


free -m | awk 'NR==2 {printf "当前使用率是 %d%\n",int(2*100)"%"}' 输出(当前使用率是 12%)


awk 之 if 判断:


awk '{if ($1=="识别完成") {print 1} else {print 0}}'如果 $1 的值等于识别完成这四个字,就输出 1,否则输出 0;


awk 扩展正则:


awk '3~/^41/ {print 1,3}' b.txt 取第三行以 41 开头的输出姓,名,编号

awk '2~/^(D|X)/ {print 1,$2}' b.txt 取第二行以 D 或者 X 开头的名输出姓,名

awk '/^[^#]/ {print $3}' /etc/fstab 取消以 #号开头的行打印输出第三行


想要查看更多的正则表达式就去👉正则表达式(全)👈


awk 'BEGIN{FS=":";print "ARGC="ARGC;for(k in ARGV) {print k"="ARGV[k]; }}' /etc/passwd
awk 'BEGIN{print ENVIRON["PATH"];}' /etc/passwd
awk 'BEGIN{OFMT="%.3f";print 2/3,123.11111111;}' /etc/passwd
awk '{tmp=$0;getline;print tmp"="$0}' test.txt
复制代码


发布于: 刚刚阅读数: 4
用户头像

A-刘晨阳

关注

还未添加个人签名 2022-06-16 加入

本人公众号《小刘Linux》,优质博主,欢迎大家的关注

评论

发布
暂无评论
Linux三剑客grep、sed、awk以及正则表达式_Linux_A-刘晨阳_InfoQ写作社区