Linux文本处理三剑客

LInux想必大家都不陌生,命令行秒杀微软的DOS,自从用上了linux鼠标似乎离我也原来越远了.今天我们不多说linux,说说linux的文本处理工具.

一.Grep:  全称: Global search Regular expression and Print out the line.

作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行;

模式: 有正则表达式字符以及文本字符所编写的过滤条件;

REGXP:有一类特殊字符以及文本字符所编写的模式;其中有些字符不表示字符字面意义,而表示控制或通配的功能;

分两类:

     1.基本正则表达式:BRE

     2.扩展正则表达式:ERE

1.正则表达式引擎:

   Grep [OPTION] PATERN [FILE…]

    

     选项;

        --color=auto: 对匹配到的文本着色显示;

     -v:显示不能够被pattern匹配到的行;

     -i: 忽略字符大小写;

     -o:仅显示匹配到的字符串;

     -q: 静默模式,不输出任何信息;

     -A #,after,后#行

     -B #, before,前#行

     -C #: context, 前后各#行

  

     -E:使用ERE:              ps:   grep -E = egrep

基本正则表达式元字符:

   字符匹配:

     .:匹配任意单个字符;

     []: 匹配指定范围内的任意单个字符;

     [^]: 匹配指定范围外的任意单个字符;

        [:digit:]、[:lower:]、[:upper:],[:alpha:],,[:punct:],[:space:]

   匹配次数: 用在要指定次数的字符后面,用于指定前面的字符要出现的次数;

 *:匹配前面的字符任意次;

   例如: grep “x*y”

        Abxy,

     Xay

     Xxxxxxxxy

     贪婪模式:能匹配多少就匹配多少

   .*:任意长度,任意字符;

   \?:匹配前面的字符零次或一次;即前面的字符可有可无;

   \+:匹配其前面字符至少一次,多则不限;

   \{m\}; 匹配前面字符m次;

   \{m,n\}:匹配前面的字符至少m次,至多n次;

        \{0,n\}:匹配前面字符至多n次;

        \{m.\}: 匹配前面字符至少m次,多则不限;

  

   位置锚定:

     ^:行首锚定:用于模式的最左侧.。

        ^root

     $:行尾锚定:用于模式的最右侧。

     ^PATTERN$:用模式匹配整行;

     ^$:空行;

     ^[[:space:]]*$

\< 或 \b:词首锚定: 用于单词模式的左侧;

\> 或 \b:词尾锚定:用于单词模式的右侧;

\<PATTERN\>: 匹配整个单词;

分组:

   \(\): 将多个或一个字符捆绑在一起,当做一个整体进行处理;

\(xy\)*ab

后向引用:引用前面的分组括号中的模式所匹配字符,(而非模式本身)

Note:分组括号中的模式匹配到的内容会被正则表达式引擎记录与内部的变量中,这些变量的命名方式为:\1,\2,\3,…

   \1:从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符串;

   \(ab\+\(xy\)*\);

     \1: ab\+\(xy\)*

     \2: xy

后向引用: 引用前面的分组括号中的模式所匹配的字符,(而非模式本身)

Egrep及扩展正则表达式:

   Egrep = grep -E

   Egrep [OPTIONS] PATTERN [FILE…]

扩展正则表达式的元字符:

.

[]

[^]

次数匹配:

*

?:0或一次;

{m}:匹配m次;

{m,n}:至少m,至多n次;

锚定:

^

$

\<, \b

\>, \b

分组:

   ()

   后向引用: \1,\2,…

或者:

   A|b

     C|cat: cat或c

另外   还有  Fgrep:不支持正则表达式搜索;   

二.

Sed 行编辑器: 全称: Stream EDitor

用法:

   Sed [option]… ‘script’ inputfile…

   常用选项:

     -n :不输出模式中的内容至屏幕;

     -e: 多点编辑功能;

     -f /PATH/TO/SCRIPT_FILE; 从指定文件中读取编辑脚本;

     -r: 支持使用扩展的正则表达式;

     -i: 原处编辑;

   地址定界

     1:不给地址, 对全文进行处理;

     2: 单地址;

           #:指定的行;

          /pattern/: 被此处模式所能够匹配到的每一行;

     3:地址范围:

        #,#

        #,+#

        /pat1/,/pat2/

        #,/pat1/

     编辑命令:

        d: 删除

        sed’/^UUID/d’/etc/fstab 删除UUID开头

        sed’/^#/d’/etc/fstab 删除#号开头的行

        sed’/^$/d’/etc/fstab 删除空白开头的行

        sed’1,4d’/etc/fstab 删除一到四行的内容

        p: 显示模式空间中的内容

        a \ ‘text’:在行后面追加文本;支持使用\n实现多行追加;  Example::   sed ‘/^UUID/a \# Hello sed.’/etc/fstab       ps:在带有uuid的行后面追加hello sed

  

        i \text:在符合条件行前面添加文本;支持\n实现多行插入

       c \text: 替换行为单行或多行文本;

       w /path/to/somefile: 保存模式空间内容到指定文件中

       r /path/to/somefile: 读取指定文件的文本流至模式空间中匹配到的行的行后;

       =: 为模式空间的打印行号;

      !:取反条件;

       s///:支持使用其他分隔符,s@@@,s###;

替换标记:

       g: 行内全局替换;

       i: 忽略字符大小写;

       w /PATH/TO/SOMEFILE: 将替换成功的结果保存至指定文件中

  

高级编辑命令:

       h: 把模式空间中的内容覆盖至保持空间;

  H:把模式空间中的内容追加至保持空间;

  g: 从保持空间去出数据覆盖至模式空间;

  x:把模式空间中的内容与保持空间中的内容进行互换

  n:读取匹配到的行的下一行到模式空间;

  N:追加匹配到的行的下一行到模式空间;

  d:删除模式空间中的行;

  D:删除多行模式空间中的所有行;

sed的一些常用操作 

  sed -n ‘n;p’ FILE: 显示偶数行

  sed ‘1!G;h;$!d’FILE 逆向显示文件内容

  sed ‘$!N;$!D’ FILE 显示文件后两行

  sed ‘$!d’ FILE 显示文件最后一行

  sed ‘G’ FILE  在每一行后面多加一个空白行

  sed ‘/^$/d;G’ FILE: 把多个空白行合并成一个,每一行追加一个空白行。

三..  GNU awk:

   Awk: 报告生成器,格式化文本输出;

   AWK: Aho, Weinberger,Kernighan => New AWK, NAWK

GNU awk , gawk

Gawk – pattern scanning and processing language

   基本用法: gawk [options] ‘program’ FILE…

     Program : PATTERN{ACTION STATEMENTS}

        语句之间使用分号分隔

     Print, printf

  

选项:

   -F: 指明输入时用到的字段分隔符;

   -v:var=value: 自定义变量;

  

(1) Print

Print item1, item2,,…

要点:

1. 逗号分隔符;

2. 输出的各item可以字符串,也可以是数值;当前记录的字段,变量或awk的表达式;

3. 如省略item,相当于print $0;

2. 变量

2.1 内建变量

   FS:input field separator,默认空白字符;

   OFS:output field separator, 默认空白字符;

   RS: input record separator, 输入时的换行符;

   ORS:output record separator, 输出时的换行符;

  

   NF: number of field, 字段数量;

   NR: number of record, 行数

   FNR: 个文件分别计数: 行数

   FilENAME:当前文件名

ARGC: 命令行参数的个数;

   ARGV: 数组, 保存的是命令行所给定的各参数;

(2).自定义变量:

   1.   -v var=value

     变量名区分大小写:

   2. 在program中直接定义

(3). print命令

格式化输出:printf FORMAT, item1, item2,…

1. FORMAT必须给出;

2. 不会自动换行,需要显示给出换行符,\n

3. FORMAT需要分别为后面的item指定一个格式化符号;

格式符:

   %c:显示字符的ASCII码;

   %d,%i:显示十进制整数;

   %e,%E:科学计数法显示;

   %f:显示为浮点数;

   %g,%G:以科学计数法或浮点形式显示数值;

   %s:显示字符串;

    %u:无符号整数;

    %%:显示%自身;

(4)修饰符:

   #[.#]:第一个数字控制显示的宽度;第二组表示小数点的精度;

     %3.1f

     -:减号,左对齐

     +:显示数值的符号;

(5)操作符:

     算术操作符:

        X+y, x-y, x*y, x/y, x^y, x%y

        -x

        +x: 将字符串转换为数值:

     字符串操作符:没有符号的操作符,字符串连接

     赋值操作符:

        =, += , -=, *=, /=, %=,^=

        ++, --

     比较操作符:

>,>=,<,<=,!=,==

     模式匹配符:

        ~:是否匹配

        !~:是否不匹配

    

逻辑操作符:

   &&

   ||

   !

函数调用:

   Function_name(argu1, argu2,…)

条件表达式:

   Selector?if-true-expression;if-false-expression

(6)PATTERN

1. empty: 空模式,匹配每一行;

2. /regular expression/: 仅处理能够被此处的模式匹配到的行;

3. relational expression :关系表达式:结果有“真”有“假”;结果为“真”才会被处理;

   真:结果为非零值,非空字符串;

4. Line ranges: 行范围,

   Startline,endline: /part1/,/part2/

注意: 不支持直接给出数字的格式

Awk -F:‘(NR>=2&&NR<=10){print $1}’/etc/passwd

(7) BEGIN/END模式:

  BEGIN{}:仅在开始处理文件中的文本之前执行一次;

 END{}:仅在文本处理完成之后执行一次;

(8)常用的action:

1. Expressions

2. Control statements: if, while等;

3. Compound statements: 组合语句;

4. Input statements

5. Output statements

(9).控制语句

  If(condition){statements}

   If(condition){statements}else {statements}

 While(condition) {statements}

Do {statements} while (condition)

For(expr1;expr2;expr3) {statements}

Break

Continue

Delete array[index]

Delete array

Exit

{ statements }

Print :输出内容后自动换行

Printf: 可以自定义输出的模式,另外输出内容之后不自动换行;

(10). if-else

   语法: if(condition) statement [else statement ]      awk -F: '{if($3>=1000){printf "CommonUser: %s\n", $1} else {printf "SystemUser or root: %s\n", $1}}' /etc/passwd   

Exampleawk:     '{if(NF>5) print}' /etc/fstab

df -h | awk -F[%] '/^\/dev/{print $1}' | awk '{if($NF>=20) print $1}'

(11).  while循环

    语法: while(condition) statement

        条件“真”,进入循环;条件“假”,退出循环;

    使用场景:对一行内的多个字段逐一类似处理时使用;对数组中的各元素注意处理时使用;

Length() : 记录字符串长度

(12). do-while循环

  语法: do statement while(condition)

     意义:至少执行一次循环

(13).for循环

  语法: for(expr1;expr2;expr3) statement

  For(variable assignment;condition;iteration process) {for-body}

特殊用法:

  能够遍历数组中的元素;

     语法:for(var in array) {for-body}

(14). switch语句

  语法:switch(expression) {case VALUE1 or /REGEXP2/; statement; …; default; statement}

(15). break和continue

  Break [n]

  Continue

(16). next:提前结束本行的处理,直接进入下一行;

(18).  array

关联数组: array[index-expression]

      

     Index-expression:

       1.可使用任意字符;字符串要使用双引号;

       2.如果某数组元素事先不存在,在引用时,awk会自动创建元素,并将其值初始化为“空串”;

若要判断数组中是否存在某元素,要使用”index in array”格式进行;

Weekdays[mon]=”Monday”

若要遍历数组中的每个元素,要使用for循环;

  For(var in array) {for-body}

Awk.'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for(i in weekdays) {print weekdays[i]}}'       

注意: var会遍历array的每个索引

练习:

统计/etc/fstab文件中文件系统类型出现的次数;

awk '/^UUID/{state[$3]++}END{for(i in state){print i, state[i]}}' /etc/fstab

统计指定文件中每个单词出现的次数;

awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count){print i, count[i]}}' /etc/fstab

(19) .函数

   内置函数:

     数值处理:

        rand():返回0和1之间的随机数; 注意:同一个awk命令取到的随机数不会改变;

     字符串处理:

        length([s]):返回指定字符串的长度;

        sub(r,s,[t]):以r表示的模式来查找t所表示的字符中的匹配的内容,并将其第一次出现替换为s所表示的内容;

        gsub(r,s,[t]): 以r表示的模式来查找t所表示的字符中的匹配的内容,并将其所有出现均替换为s所表示的内容;

split(s,a[,r]):以r为分隔符切割s,并将切割后的结果保存至a所表示的数组中;

猜你喜欢

转载自www.cnblogs.com/Kennard-1999/p/10453861.html