awk grep sed

awk内建变量
FILENAME 当前输入文件的文件名,该变量是只读的
NR 当前行的行号,该变量是只读的,R代表record
NF 当前行所拥有的列数,该变量是只读的,F代表field
OFS 输出格式的列分隔符,缺省是空格
FS 输入文件的列分融符,缺省是连续的空格和Tab
ORS 输出格式的行分隔符,缺省是换行符
RS 输入文件的行分隔符,缺省是换行符
awk 'BEGIN {FS=":"} {print $1;}' /etc/passwd


$0表示整个当前行


/pattern/{actions}
condition{actions}


awk '$2<75 {printf "%s\t%s\n", $0, "REORDER";} $2>=75 {print $0;}' testfile


统计一个文件中的空行数
awk '/^ *$/ {x=x+1;} END {print x;}' testfile


单引号:用于保持引号内所有字符的字面值
双引号:$取变量的值,\表示命令替换($ ' " \)


正则表达式语法
字符类
. 任意一个字符
[] 括号中任意一个字符
- 在括号中表示字符的范围
^ 位于括号内的开头,匹配括号中的字符之外的任意一个字符
[[:alpha:]] 匹配一个字母
[[:digit:]] 匹配一个数字


数量限定符
? 紧跟在它前面的单元匹配0或1次
+ 紧跟在它前面的单元匹配1或多次
* 紧跟在它前面的单元匹配0或多次
{N} 紧跟在它前面的单元匹配N次
{N,} 紧跟在它前面的单元匹配至少N次
{,M} 紧跟在它前面的单元匹配最多M次
{N,M} 紧跟在它前面的单元匹配N-M次


位置限定符
^ 匹配行首位置
$ 匹配行末位置,回车也算是最后一个字符,因此先用dos2unix转换
\< 匹配单词开头的位置  \<th  如this
\> 匹配单词结尾的位置 p\>  如leap
\b 可单用或连用,匹配单词开头(放在前)或结尾的位置(放在后)\bat at\b
\B 可单用或连用,匹配非单词开头(放在前)或结尾的位置(放在后)\Bat at\B


其它特殊字符
\ 转义字符,可能把普通转义成特殊,如"<"转成"\<",也可能把特殊转义成普通,如"\."表示为"."
() 将一部分括起来组成一个单元,对整个单元使用数量限定符,^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$
([0-9]{1,3}\.){3}[0-9]{1,3}
| 连接两个子表达式,表示或关系  n(o|either)


若为Basic规范,则? + {} | ()为普通字符




SED
sed意为流编辑器(Stream Editor),在Shell脚本和Makefile中作为过滤器使用非常普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑命令转换为另一种格式输出。


sed option 'script' file1 file2 ...
sed option -f scriptfile file1 file2 ...


/pattern/action
pattern是正则表达式,action是编辑操作。sed程序一行一行读出待处理文件,如果某一行与pattern匹配,则执行相应的action,如果一条命令没有pattern而只有action,这个action将作用于待处理文件的每一行。


/pattern/p 打印匹配pattern的行
/pattern/d 删除匹配pattern的行
/pattern/s/pattern1/pattern2/ 查找符合pattern的行,将该行第一个匹配pattern1的字符串替换为pattern2
/pattern/s/pattern1/pattern2/g 查找符合pattern的行,将该行所有匹配pattern1的字符串替换为pattern2


sed是把待处理文件的内容连同处理结果一起输出到标准输出的,因此p命令表示除了把文件内容打印出来之外还额外打印一遍匹配pattern的行。
要想使用d命令就不需要-n参数了,比如删除含有abc的行只输出处理结果,应加上-n选项,这种用法相当于grep命令
sed命令不会修改原文件,删除命令只表示某些行不打印输出,而不是从原文件中删去。


sed 's/bc/-&-/' testfile
pattern2中的&表示原文件的当前行中与pattern1相匹配的字符串


sed 's/\([0-9]\)\([0-9]\)/-\1-~\2~/' testfile
sed -r 's/([0-9])([0-9])/-\1-~\2~/' testfile
pattern2中的\1表示与pattern1的第一个()括号相匹配的内容,\2表示与pattern1的第二个()括号相匹配的内容。sed默认使用Basic正则表达式规范,如果指定了-r选项则使用Extended规范,那么()括号就不必转义了。


<html><head><title>Hello World</title>
<body>Welcome to the world of regexp!</body></html>
若sed 's/<.*>//g' testfile,则为空,最长匹配原则。
sed 's/<[^<>]*>//g' testfile
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值