Shell三剑客grep、awk、sed

https://blog.csdn.net/sj349781478/article/details/82930982

grep、awk、sed大概介绍

  • grep 基于正则表达式查找满足条件的内容
  • awk 报告生成器,格式化文本输出
  • sed 修改数据

grep

grep [OPTIONS] PATTERN [FILE...]

参数

-o 仅显示匹配到的字符串
-E 使用ERE,相当于egrep
--color=auto 对匹配到的文本着色显示
-v 显示不被pattern匹配到的行
-i 忽略字符大小写
-n 显示匹配的行号
-c 统计匹配的行数
-q 静默模式,不输出任何信息
-A # after, 后#行
-B # before, 前#行
-C # context, 前后各#行
-e 实现多个选项间的逻辑or关系
grep –e ‘cat ’ -e ‘dog’ file
-w 匹配整个单词
-F 相当于fgrep,不支持正则表达式

/  请无视

 /  echo 12345 | grep 2
12345
 /  echo 12345 | grep -o 2
2
 /  echo 12341234 | grep -oE '.*?3'
123
4123

正则表达式

 /  echo hello world  hiiii| grep -oE "hello|hi"
hello
hi
  • [ ] 匹配在[ ] 中的任意一个字符
/  echo asd | grep -E "[a]"
asd
  • [^ ] 匹配内容不能有[ ] 中任意一个字符
 /  echo asd | grep -oE "[^a]"
s
d

正则表达式相关: https://docs.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-language-quick-reference

awk

awk [options] 'program' file…

1、program:pattern{action statements;..}

  • pattern部分决定动作语句何时触发及触发事件
    BEGIN,END
  • action statements对数据进行处理,放在{}内指明
    print, printf

2、选项:

  • -F 指明输入时用到的字段分隔符
  • -v var=value 自定义变量

3、分割符、域和记录

  • awk执行时,由分隔符分隔的字段(域)标记1,1,2..n称为域标识,n称为域标识,0为所有域。
  • 省略action,则默认执行 print $0 的操作。
echo 7,8,9 | awk -F, '{print $2}'
8
8

4、变量
FS:输入字段分隔符(分割列);OFS:输出字段分隔符();RS:输入记录分隔符(分割行);ORS:输出记录分隔符;NF:字段数量;NR:记录号;
NFR:各文件分别计数,记录号。FILENAME:当前文件名;ARGC:命令行的参数;ARGV:数组,保存的是命令行所给定的各参数。

 **** ps | awk '{print $0}'
  PID TTY           TIME CMD
79791 ttys000    0:00.09 ssh 11***4@shell.***-***.com
44956 ttys001    0:00.06 /Applications/iTerm.app/Contents/MacOS/iTerm2 --server login -fp apple
44958 ttys001    0:10.59 -zsh

****ps | awk '{print $2}'
TTY
ttys000
ttys001
ttys001

- NF字段数
****  ps | awk '{print $NF}' #由前面可知一行有4列,所以这里等价于 $4
CMD
11***@shell.****-****.com
apple

****ps | awk 'NR>1{print $(NF-1)}'
ssh
-fp
  • FS 分割列
**** echo 2/3/4 | awk 'BEGIN{FS="/"}{print $1}'
2   #以 / 做分割
**** echo 2/3/4 | awk 'BEGIN{print $1}'
  #取不到,2/3/4被视为一个整体,没有分割
  • RS分割行
**** echo 2/3/4 | awk 'BEGIN{RS="/"}{print $0}'  #以 / 作为行的分割标志
2
3
4
  • ORS输出分隔符
[*****@izuefockpz ~]$ echo $PATH | awk 'BEGIN{RS=":"}{print $0}'
/usr/local/bin
/usr/bin
/usr/local/sbin
/usr/sbin

[****@izuefockpz ~]$ echo $PATH | awk 'BEGIN{RS=":"}{print $0}' | awk 'BEGIN{FS="\n";ORS=":"}{print $0}'
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin

4、awk控制语句

  • { statements;… } 组合语句
  • if(condition) {statements;…}
  • if(condition) {statements;…} else {statements;…}
  • while(conditon) {statments;…}
  • do {statements;…} while(condition)
  • for(expr1;expr2;expr3) {statements;…}

sed

sed [option]... 'script' inputfile
1、选项
-n 不输出模式空间内容到屏幕,即不自动打印
-e 多点编辑
-f /PATH/SCRIPT_FILE: 从指定文件中读取编辑脚本
-r 支持使用扩展正则表达式
-i 直接编辑文件
-i.bak 备份文件并原处编辑
2、script 地址定界
不给地址:对全文进行处理
单地址:
#: 指定的行,$:最后一行
/pattern/:被此处模式所能够匹配到的每一行
地址范围:
#,#
#,+#
/pat1/,/pat2/
`#,/pat1/
~:步进
1~2 奇数行
2~2 偶数行
3、编辑命令:
d 删除模式空间匹配的行,并立即启用下一轮循环
p 打印当前模式空间内容,追加到默认输出之后
a []text1 在指定行后面追加文本,支持使用\n实现多行追加
i []text 在行前面插入文本
c []text 替换行为单行或多行文本
w /path/somefile 保存模式匹配的行至指定文件
r /path/somefile 读取指定文件的文本至模式空间中匹配到的行后
= 为模式空间中的行打印行号
! 模式空间中匹配行取反处理
s///:查找替换,支持使用其它分隔符,s@@@,s###

**** echo hello world | sed 's#hello#AAAA#'
AAAA world

4、替换标记:
g 行内全局替换
p 显示替换成功的行
w /PATH/TO/SOMEFILE 将替换成功的行保存至文件中

你可能感兴趣的:(Shell三剑客grep、awk、sed)