天天看点

linux正则表达式、sed、awk命令使用总结

一、正则表达式

        linux的正则主要分为基础正则和拓展正则,基础的正则如下:

linux正则表达式、sed、awk命令使用总结

        1.正则匹配时会最大化匹配结果

            正则表达式由于其贪婪匹配的逻辑,会将结果进行最大化匹配,经常书写出的正则会超出我们的需要,所以书写时我们要用定界符到,如/etc/passwd文件中的第一列为用户名,用冒号分隔,后面都跟x,如果我们简单的以:作为分隔符,正则或最大化匹配结果,匹配到最后一个x,但我们可以如果用:x:来做定界符,就能精确定位到我们想要的结果

linux正则表达式、sed、awk命令使用总结
linux正则表达式、sed、awk命令使用总结

      2.转义字符的使用

        正则中,只要不是想要搜索的符号,就必须加\转义字符将其转换为原本的意思,如上表中的 ma(tri)?,[0-9]{3}等正则例子,实际书写时都要加转义字符,写为“ma\(tir\)\?”和'[0-9]\{3\}',而同样,如果想搜索的符号中有* ?之内的正则表达符号,也要加转义字符才能代表原本的符号含义.

        3.[]的注意事项

        [a-zA-Z]代表包含大小写的所有单个字母,不能写成[a-Z];

        [a-z_-]代表匹配字母或下划线或横杠,不能写成[a-z-_]

        4.写正则时需要不断试错

         即便写出了匹配的正则表达式,用定界符进行精准匹配后,正则中仍然会出现结果不符合要求的情况,需要对表达式不断修改,不断试错,才能得到想要的结果

二、grep 命令

       所有参数:

linux正则表达式、sed、awk命令使用总结

        常见用法:

                  1.   -b -o  统计字符串的偏移量(即一行中相对行首的位置差)

echo gun is not unix | grep -b -o "not"
7:not

#一行中字符串的字符偏移是从该行的第一个字符开始计算,起始值为0。选项 -b -o 一般总是配合使用。                               

                    2.-l和-L 在多文件查找时,仅输出符合条件/不符合条件的文件的文件名,不输出内容

                    3.-f 和字符串匹配,正则式匹配不同,将单独的文件作为匹配样式,每一个匹配的样式为一行

#在样式文件中逐行写出需要匹配的字符。
cat patfile
aaa
bbb

echo aaa bbb ccc ddd eee | grep -f patfile -o           

                      4.-A -B -C  除了输出匹配内容外,还输出匹配内容上/下/上下行的内容,可以指定几行

#如果匹配结果有多个,会用“--”作为各匹配结果之间的分隔符:
echo -e "a\nb\nc\na\nd\nc" | grep a -A 1
a
b
--
a
d           

                      5. -q 静默输出,不会输出任何信息,如果命令运行成功返回0,失败则返回非0值。一般用于条件测试。

                      6.--include 排除目标文件   

                                 1)--include *{.c,.cpp} 仅仅在文件夹中搜索.c和.cpp文件;  

                                 2)--exclude "README" 排除全部README文件

                                 3) --include-dir 仅在某些文件夹中搜索 

                                 4) --exclude-dir 排除某些文件夹 

                                 5) --exclude-from FILE 从文件FILE中读取须要排除的文件列表

#只在目录中所有的.php和.html文件中递归搜索字符"main()"
grep "main()" . -r --include *.{php,html}

#在搜索结果中排除所有README文件
grep "main()" . -r --exclude "README"

#在搜索结果中排除filelist文件列表里的文件
grep "main()" . -r --exclude-from filelist           

三、cut:字段简单剪切命令

             该命令有两项功能,其一是用来显示文件的内容,它依次读取由参数file所指明的文件,将它们的内容输出到标准输出上;其二是连接两个或多个文件,如cut fl f2 > f3将把文件fl和几的内容合并起来,然后通过输出重定向符“>”的作用,将它们放入文件f3中。

                1.格式

                                            cut(options)(参数)

                2.全部参数

linux正则表达式、sed、awk命令使用总结

                   3.常见用法

#学生报表信息,包含No、Name、Mark、Percent:
[[email protected] text]# cat test.txt 
No Name Mark Percent
01 tom 69 91
02 jack 71 87
03 alex 68 98
#使用 -f 选项提取指定字段:
[[email protected] text]# cut -f 1 test.txt 
No
01
02
03
[[email protected] text]# cut -f2,3 test.txt 
Name Mark
tom 69
jack 71
alex 68
#--complement 选项提取指定字段之外的列(打印除了第二列之外的列):

[[email protected] text]# cut -f2 --complement test.txt 
No Mark Percent
01 69 91
02 71 87
03 68 98
#使用 -d 选项指定字段分隔符:

[[email protected] text]# cat test2.txt 
No;Name;Mark;Percent
01;tom;69;91
02;jack;71;87
03;alex;68;98
[[email protected] text]# cut -f2 -d";" test2.txt 
Name
tom
jack
alex           

注意:cut的分隔符,默认为制表符,可以-d指定其他分隔符,但是不能指定空格(-d " ")!,即如果文本内容以空格分隔,cut会认为文本只有一列

四、sed:功能强大的流式文本编辑器

                格式:

sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)      

                  重要参数:

                -n :即--slient和 -quiet 静默输出 只打印脚本或command处理过行 

                -e :直接在命令行模式上进行sed动作编辑,此为默认选项

                -f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作 

                -r :支持扩展正则表达式

                -i :直接修改文件内容,不输出到屏幕

                    sed command:

linux正则表达式、sed、awk命令使用总结

            注意:

  1.         sed命令中,字符串或正则的两边需要加上双斜杠//  如添加动作:‘/正则式/i’  
  2.          sed '2,4d'  将2-4行内容删除,而不是删除第2行和第4行
  3.         sed 's/book/BOOKS/g' file  g是全局参数,不加只替换第一个
  4.         &的用法    已匹配字符串标记
    echo this is a test line | sed 's/\w\+/[&]/g'
    [this] [is] [a] [test] [line]           
  5.         \1的用法,子串匹配标记
    echo this is digit 7 in a number | sed 's/digit \([0-9]\)/\1/'
    this is 7 in a number           
  6.         r/w    从文件读入,或写入到文件(前者不改变文件内容,后者改变)
    #将匹配内容显示在匹配行下
    sed '/test/r file' filename
    #在example中所有包含test的行都被写入file里:
    sed -n '/test/w file' example           
  7.         q    中途退出命令
    #打印完第10行后,退出sed
    sed '10q' file           

五、awk:文本和数据进行处理的编程语言

        (awk命令比较复杂,涉及到编程思想和逻辑判断,仅总结目前知识水平范围内的内容)

         1.awk的模式(patten)和操作(command)

           模式可以是以下任意一个:

  • /正则表达式/:使用通配符的扩展集。
  • 关系表达式:使用运算符进行操作,可以是字符串或数字的比较测试。
  • 模式匹配表达式:用运算符

    ~

    (匹配)和

    ~!

    (不匹配)。
  • BEGIN语句块、pattern语句块、END语句块(即拓展commend,一般在BEGIN中赋值,申明等,END中进行操作,运算等,BEGIN和END不参与逻辑循环)                

            操作由一个或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内,主要部分是:

  •            变量或数组赋值
  •            输出
  •           内置函数
  •            控制流语句

          2. 内置参数(变量)

  1. $0,$1,$2 列数,从0开始(默认空格和制表符为分隔符,-F或fs==指定分隔符)

    awk '{printf $1}' //打印第一个字母

  2. NR,NF 行号和字段数
  3. FILENAME 文件名
  4. 完整的内置参数如下:
    linux正则表达式、sed、awk命令使用总结

              3.逻辑处理

            作为一种程序设计语言所应具有的特点之一,awk支持多种运算,这些运算与C语言提供的基本相同。awk还提供了一系列内置的运算函数(如log、sqr、cos、sin等)和一些用于对字符串进行操作(运算)的函数(如length、substr等等)。

运算符 描述 举例
+ - 加,减

awk 'BEGIN{a="b";print a++,++a;}'

输出:0 2

(注意:所有用作算术运算符进行操作,操作数自动转为数值,所有非数值都变为0)

*  /  & 乘 除 求余
++  -- 增加和减少(作为前缀和后缀)
> >= != ==

关系运算符

(注意:> < 可以作为字符串比较,也可以用作数值比较,关键看操作数如果是字符串就会转换为字符串比较。两个都为数字才转为数值比较。字符串比较:按照ASCII码顺序比较。)

awk 'BEGIN{a=11;if(a >= 9){print "ok";}}'

输出:ok

= += -= *= ... 赋值语句 a+=5; 等价于:a=a+5; 其它同类
||  && 逻辑或,逻辑与

awk 'BEGIN{a=1;b=2;print (a>5 && b<=2),(a>5 || b<=2);}'

输出:0 1

~ ~! 正则表达式的匹配和不匹配

awk 'BEGIN{a="100testa";if(a ~ /^100*/){print "ok";}}'

输出:ok

?: C条件表达式

awk 'BEGIN{a="b";print a=="b"?"ok":"err";}'

输出:ok

in 数组中是否存在键值

awk 'BEGIN{a="b";arr[0]="b";arr["b"]="c";print (a in arr);}'

输出:1

4.拓展格式

拓展格式如下: 

awk [options]'BEGIN{print"START"}pattern{commands}END{print "END"}'

一般在BEGIN中赋值,申明等,END中进行操作,运算等,BEGIN和END不参与逻辑循环

awk -F ':' 'BEGIN{print "Line  Col  User"}{print NR"    ",NF"   ",$1}END{print"--------"FILENAME"------------"}'  /etc/passwd  |more
#显示每行的行号,列数(用:作为分隔符)并在表头和结束打印相关内容           

5.与sed的比较

    awk和sed都是流式文本数据处理命令,都支持管道操作,一般什么情况选择sed,什么情况选择awk呢?

1.两个命令都是行处理命令,具体的逻辑是一次读入一行内容,然后处理一行内容,处理完成后又处理下一行内容 

2.和sed相比,同样是对一行的内容进行操作,awk可以进行切片处理,分‘列’进行处理(根据分隔符将一行拆分成多列,如使用内置参数$1 ,$2可对第2列和第3列进行提取操作)

3.sed命令对复杂正则的匹配度较高,在处理正则的复杂匹配和精确匹配时,建议优先考虑使用sed命令

4.awk命令由于可以进行逻辑处理和流程控制,在对文本的操作逻辑性较强时,推荐优先考虑awk命令

参考内容:

https://www.cnblogs.com/tlnshuju/p/7106790.html  grep命令最经常使用的功能总结

http://man.linuxde.net/sed    sed命令_Linux sed 命令用法详解:功能强大的流式文本编辑器

http://man.linuxde.net/awk   awk命令_Linux awk 命令用法详解:文本和数据进行处理的编程语言

https://www.imooc.com/learn/819 实例妙解Sed和Awk的秘密

继续阅读