grep sed akw

sed参考

#打印2-4行

[root@localhost ~]# sed -n '2,4p' test

[root@localhost ~]# awk 'NR==2,NR==4{print}' test    

打印单行

[root@localhost ~]# sed -n '4'p test     

[root@localhost ~]# awk 'NR==4{print}' test

 

#打印关键字行

[root@localhost ~]# grep 'zx' test

[root@localhost ~]# sed -n '/zz/p' test  #别忘了-n

[root@localhost ~]# awk '/zz/{print}' test

打印关键字所在的行号

awk '/zz/{print NR}' test

sed -n '/hello/=' file

 打印文件一共多少行

awk END'{print NR}' file

awk '{print NR}' file|tail -n1

[root@localhost ~]# echo -e "1@2@3" |awk 'BEGIN{RS="@"}{print $0}'     
1
2
3

[root@localhost ~]# echo -e "1@2@3" |awk 'BEGIN{RS="@"}{print $0,RT}'  #以RS切割
1 @
2 @
3
 

RS是某个固定的值时,RT就是RS的内容。

[root@localhost ~]# echo -e "1\n2\n3\n"|awk 'BEGIN{ORS="@"}{print $0}'     # echo打印\n时要加-e  和"" 切记切记   ORS用@替换默认的\n   ORS和RS默认分割都是\n  ORS可以看做是RS倒过来的

                                           形式 以 ORS替换原来的\n 切割
1@2@3@@[root@localhost ~]#

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

grep 查询   sed 替换、插入  awk 按域查找

grep

-c     匹配行数量

-i      忽略大小写

-h     多文件查询不显示文件名

-l       只列出符合匹配的文件名,不显示具体的匹配行内容

-n      列出匹配行,并显示行号

-s       不显示,当查询不存在的文件名时出现错误信息将不会显示 

-v       相反查询,显示不匹配的行

-w      匹配整个词

-x      匹配整行

-r       递归搜索,不仅搜索当前工作目录,而且搜索字目录

-q      不会输出任何结果   ,匹配成功$?为0   不成功为1

--color  显示匹配颜色  (用ssh软件自动带颜色 )

-A2 多加显示后两行

-B3  多加显示前3行

-C4   多加显示前后4行

-o   只显示匹配到的字符串

-E 支持扩展的正则表达式    grep -E 'C|cat' file      grep -E '^[[:space:]]+'  file 开头至少一个空白字符的行    grep -E = egrep

grep命令的-o和-P选项 2014-05-09 22:03:59

分类: Linux

 

先看man中介绍:      
-o, --only-matching: 只显示匹配部分的内容
              Show only the part of a matching line that matches PATTERN.      
-P, --perl-regexp:
              Interpret PATTERN as a Perl regular expression.

 

例如

#   echo "helloworld123456"| grep -o -P '\d+'

 

返回  123456

#echo "helloworld123456"| grep -o -P '[a-z]+'     #拓展正则  用egrep不加P也行

返回  helloworld

 

-P 选项是利用PERL的正则语法进行匹配

zzx@zzx134:~/dhcptest$ cat aaa; grep -q 33 aaa;echo $?;grep -q nihao aaa;echo $?
a b c d         aa      bb:11:33:::kkk
1 2 3 4         cc      dd:22:44:::qqq
0
1

zzx@zzx134:~/dhcptest$ grep -c ^$ aaa  #空白行数量
4

zzx@zzx134:~/dhcptest$ grep -cv ^$ aaa    #非空行
2

zzx@zzx134:~/dhcptest$ grep "\<aa\>"  aaa  #精确匹配
a b c d         aa      bb:11:33:::kkk
zzx@zzx134:~/dhcptest$ grep "\<a\>"  aaa 
a b c d         aa      bb:11:33:::kkk

zzx@zzx134:~/dhcptest$ grep [ab]  aaa       
a b c d         aa      bb:11:33:::kkk
zzx@zzx134:~/dhcptest$ grep [^ab]  aaa   #包含空   
a b c d         aa      bb:11:33:::kkk
1 2 3 4         cc      dd:22:44:::qqq

zzx@zzx120:~/zzx1/test1/test$ cat 11.txt |grep "[^1]"     
1 11 111
111 111
123 456  333
asd aaa
the

zzx@zzx120:~/zzx1/test1/test$ cat 11.txt |grep  "[^1 ]" 
123 456  333
asd aaa
the
hello i am zzx
hello i am zzx

 

zzx@zzx134:~/dhcptest$ grep -E "bb|dd" aaa    #扩张正则表达式            grep -E 等于  egrep           grep -F等于 fgrep
a b c d         aa      bb:11:33:::kkk
1 2 3 4         cc      dd:22:44:::qqq

 

 

awk

默认以空格为域分隔

zzx@zzx134:~$ ll |awk  '$5>102400 {print $9}'  #打印大小大于100k的文件名 

 echo "1:ab cd:line" |awk -F':' '{if($2=="ab cd")print "yes"}'

awk '{if($2!="in") print $2"       "$4} 

sed

cat 2.txt |sed 's/^[ \t]*//g'  #删除行首空格或者tab

y 对应字符替换 e 连续字符替换    's/123/abc/g' 123整体换成abc  单独一个1是不会替换的     'y/123/abc/'   后面不加g  1换a 2换b 3换c  123个数要和abc对称  不能123/abcd   单独一个1会被替换成a

-i 写入文件    sed -i  's/123//g'  file   (  s/A/B/g  A替换B   )

i 特定行插入一行    sed '/123/iAA' file   最好写'/123/i\AA\'           sed -i '/bb/i\\' file   特定行插入空行

a特定行插入一行    sed '/123/aAA' file

d 删除特定行           sed '/123/'d file     sed '1'd file

p  打印特定行          sed -n '/113/'p file       sed  -n  '1'p  file     // 一定要加  sed -n '$p' 打印最后一行     sed -n 1,3p 打印1到3行   不能用1-3

-e   多个执行          sed -e '/5/'d -e '/N/'d at.txt  精确匹配用\<xxx\>

 

r  特定行后添加其他文本内容    sed   ‘2r  file1’  file2    file1的内容添加到file2文件的第二行后

w   符合的行保存到文件中   sed  ‘/oot/w   file’   file2    file2中符合oot的行保存到file中

s    查找替换 / @ #      sed   's/A/B/'   file     A换车B   每行的第一个A      加g代表全局所有A      s///g  加数字代表第几个匹配  s///2 替换第二个匹配        i忽略大小写   & 引用模式匹配整个串     sed 's/l..k/&r/g'  file      文件中   like love 等后面添加一个r    liker  lover     

 sed   'Xs/A/B/'   file    对X行操作  A换成B    

sed '2s/\<abs\>/nihao/2' file  把第二行的第二次匹配的abs换成nihao

 

 

zzx@zzx11:~$ cat a
hello,like a love
hey,leee or LEEE
zzx@zzx11:~$ sed 's#l..e#&r#' a
hello,liker a love
hey,leeer or LEEE
zzx@zzx11:~$ sed 's#l..e#&r#g' a
hello,liker a lover
hey,leeer or LEEE
zzx@zzx11:~$ sed 's#l..e#&r#ig' a
hello,liker a lover
hey,leeer or LEEEr

\(...\) 正则表达式分组。进行子字符串提取(substring extraction)一起使用很有用
\n 第 n 个分组内容  

{n} n是一个非负整数。匹配确定的n次。例如,''o{2}'' 不能匹配 "Bob"中的''o'',但是能匹配"food" 中的两个o。

{n,} n是一个非负整数。至少匹配n次。例如,''o{2,}'' 不能匹配"Bob"中的'o'',但能匹配 "foooood"中的所有o。''o{1,}''等价于''o+''。''o{0,}''则等价于''o*''。

\{ \} 指示前面正则表达式匹配的次数.   

[root@localhost ~]# sed -n -e  '/66/p' -e '/2/p' 1    #打印含有2和66的行

zzx@zzx11:~$ sed 's#\(l..e\)#\1r#ig' a          
hello,liker a lover
hey,leeer or LEEEr


zzx@zzx134:~$ cat abc
ofjoaf
fjafjoa
..ofjoaf
zzx@zzx134:~$ sed 's/o/X/g' abc
XfjXaf
fjafjXa
..XfjXaf
zzx@zzx134:~$ cat abc         
ofjoaf
fjafjoa
..ofjoaf
zzx@zzx134:~$ sed -i 's/o/X/g' abc
zzx@zzx134:~$ cat abc            
XfjXaf
fjafjXa
..XfjXaf

 

sed常用命收集:test.txt做测试

 如何去掉行首的.字符: sed -i 's/^.//g' test.txt

 

在行首添加一个a字符: sed 's/^/a/g'    test.txt

 

在行尾添加一个a字符: sed 's/$/a/'     tets.txt

 

在特定行后添加一个c字符: sed '/wu/ac' test.txt

 

zzx@zzx103:~$ cat at.txt
1113
33465
a
r

zzx@zzx103:~$ sed '/r/aNO' at.txt  #含有r的行后加    '/1/aNO' 含有1的行后加NO    或写成  '/r/'aNO
1113
33465
a
r
NO

 

在行前加入一个c字符: sed '/wuguangke/ic' test.txt
zzx@zzx103:~$ sed '/33/'d at.txt
1113
a
NO
r
NO

 


  1. echo "123" | sed 'y/13/34/' 
  2. 324
  3. echo "123" | sed 's/1/3/g;s/3/4/g'
  4. 424
  5. echo "axxbxxcxx" | sed 'y/abc/123/'
  6. 1xx2xx3xx
[解析]
这里把source里对应的1和3转换成3和4,得到这个结果,这里是一次匹配操作,跟第二个替换又是不一样的,注意这点区别。换句话说,象在第三个替换中,我们可以一次替换一些不连续的字符成另外的字符,但是注意source的字符数量与dest的要相等。
posted on 2014-11-27 17:37  寒星12345678999  阅读(337)  评论(1编辑  收藏  举报