Linux文本处理工具

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux文本处理工具相关的知识,希望对你有一定的参考价值。

1、grep

        grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。


语法:

   grep [options] ‘pattern‘ input_file ...


[options]主要参数:
-c:只输出匹配行的计数。
-I:不区分大 小写(只适用于单字符)。
-h:查询多文件时不显示文件名。
-l:查询多文件时只输出包含匹配字符的文件名。
-n:显示匹配行及 行号。
-s:不显示不存在或无匹配文本的错误信息。
-v:显示不包含匹配文本的所有行。

pattern正则表达式主要参数:
\: 忽略正则表达式中特殊字符的原有含义。
^:匹配正则表达式的开始行。
$: 匹配正则表达式的结束行。
\<:从匹配正则表达 式的行开始。
\>:到匹配正则表达式的行结束。
[ ]:单个字符,如[A]即A符合要求 。
[ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。
。:所有的单个字符。
* :有字符,长度可以为0。


2、sed

   sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。


sed :Stream EDitor

      行编辑器(全屏编辑器:vim)

sed:模式空间

默认不编辑源文件,仅对模式空间中的数据做处理;而后,处理结束后,将模式空间打印至屏幕;


sed用法:

sed [options] ‘AddressCommand‘ file ...

options常用参数:

     -n:静默模式,不在默认显示模式空间中的内容

     -i:直接修改原文件

     -e SCRIPT -e SCRIPT:可以同时执行多个脚本

     -f /PATH/TO/SED_SCRIPT

       用法:sed -f /path/to/script file

Address:

1、StartLine,Endline

     比如1,100

     $:最后一行

2、/RegExp/

   /^root/

3、/pattern1/,/patteern2/

   第一次被pattern1匹配到的行开始,至第一次被pattern2匹配到的行结束,这中间的所有行

4、LineNumber

   指定的行

5、StartLine,+N

   从startLine开始,向后的N行;

Command

     d:删除符合条件的行;

     p:显示符合条件的行;

     a \string:在指定的行后面追加新行,内容为string

          \n:可以用于换行

     i \string:在指定的行前面添加新行,内容为string

     r filename:将指定的文件的内容添加至符合条件的行处

     w filename:将地址指定的范围内的行另存至指定的文件中;

     s/pattern(可以使用正则表达式的字符,而string不可以)/string/修饰符:查找并替换,默认替换每行中第一次被模式匹配到的字符串

          加修饰符:

          g:全局替换

          i:忽略字符大小写

s///,s###,[email protected]@@,s:::   sed可采用任意字符作为定界符

\(..\),\1,\2        \(..\)用于匹配字符串,匹配到的第一个字符串则为\1,以此类推为\2


sed练习:

1、删除/etc/grub.conf文件中行首的空白符;

     sed -r ‘s#^[[:space:]]+##g‘ /etc/grub.conf

2、替换/etc/inittab文件中“id:3:initdefault:”一行中的数字为5;

     sed ‘[email protected]\(id:\)[0-9]\(:initdefault:\)@\1\5\[email protected]‘ /etc/inittab

3、删除/etc/inittab文件中的空白行;

     sed ‘/^$/d‘ /etc/inittab

4、删除/etc/inittab文件中开头的#号;

     sed ‘s/^#//g‘ /etc/inittab

5、删除某文件中开头的#号及后面的空白,但要求#号后面必须有空白字符;

     sed ‘s/^#[[:space:]]+//g‘ sed.txt

6、删除某文件以空白符后面跟#类的行中的靠头的空白字符及#;

     sed ‘s/^[[:space:]]+#//g‘ sed.txt

7、去除一个文件路径的目录名称。

     echo "/etc/rc.d/" | sed -r ‘[email protected]^(/.*/)[^/]+/[email protected]\[email protected]


3、awk

     awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。


语法:awk ‘PATTERN[ACTION]‘ file

           print $1

           -F           


# awk [options] ‘script‘ file1 file2, ...

# awk [options] ‘PATTERN‘ { action }‘ file1 file2, ...

  

awk的输出

一、print

print的使用格式:

     print item1,item2,...

要点:

1、各项目之间使用逗号隔开,而输出时则以空白字符分割;

2、输出的item可以为字符串或数值、当前记录的字段(如$1)、变量或awk的表达式;数值会先转换为字符串,而后再输出;

3、print命令后面的item可以省略,此时其功能相当于print $0,因此,如果想输出空白行,则需要使用pring "";


例子:

# awk ‘BEGIN { print "line one\nline two\nline three" }‘

awk -F: ‘{ print $1,$3 }‘ /etc/passwd


二、awk变量

2.1 awk内置变量之记录变量

FS:field separator,读取文本时,所使用字段分隔符;

RS:Record separator,输入文本信息所用的换行符;

OFS:Output Filed Separator

ORS:Output Row Separator


2.2 awk内置变量之数据变量

NR: The number of input records,awk命令所处理的记录数;如果有多个文件,这个数目会把处理的多个文件中行统一计数;

NF:Number of Field,当前记录的field个数;

FNR: 与NR不同的是,FNR用于记录正处理的行是当前这一文件中被总共处理的行数;

ARGV: 数组,保存命令行本身这个字符串,如awk ‘{print $0}‘ a.txt b.txt这个命令中,ARGV[0]保存awk,ARGV[1]保存a.txt;

ARGC: awk命令的参数的个数;

FILENAME: awk命令所处理的文件的名称;

ENVIRON:当前shell环境变量及其值的关联数组;


如:awk ‘BEGIN{print ENVIRON["PATH"]}‘


三、printf

printf命令的使用格式:

printf format, item1, item2, ...


要点:

1、其与print命令的最大不同是,printf需要指定format;

2、format用于指定后面的每个item的输出格式;

3、printf语句不会自动打印换行符;\n


format格式的指示符都以%开头,后跟一个字符;如下:

%c: 显示字符的ASCII码;

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

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

%f: 显示浮点数;

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

%s: 显示字符串;

%u: 无符号整数;

%%: 显示%自身;


修饰符:

N: 显示宽度;

-: 左对齐;

+:显示数值符号;


例子:

# awk -F: ‘{printf "%-15s %i\n",$1,$3}‘ /etc/passwd


四、输出重定向

print items > output-file

print items >> output-file

print items | command


特殊文件描述符:

/dev/stdin:标准输入

/dev/sdtout: 标准输出

/dev/stderr: 错误输出

/dev/fd/N: 某特定文件描述符,如/dev/stdin就相当于/dev/fd/0;


例子:

# awk -F: ‘{printf "%-15s %i\n",$1,$3 > "/dev/stderr" }‘ /etc/passwd


五 awk的模式:

awk ‘program‘ input-file1 input-file2 ...

其中的program为:

pattern { action }

pattern { action }

...


5.1 常见的模式类型:

1、Regexp: 正则表达式,格式为/regular expression/

2、expresssion: 表达式,其值非0或为非空字符时满足条件,如:$1 ~ /foo/ 或 $1 == "magedu",用运算符~(匹配)和!~(不匹配)。

3、Ranges: 指定的匹配范围,格式为pat1,pat2

4、BEGIN/END:特殊模式,仅在awk命令执行前运行一次或结束前运行一次

5、Empty(空模式):匹配任意输入行;


模式匹配表达式:

模式,模式:指定一个行的范围。该语法不能包括BEGIN和END模式。

BEGIN:让用户指定在第一条输入记录被处理之前所发生的动作,通常可在这里设置全局变量。

END:让用户在最后一条输入记录被读取之后发生的动作。

本文出自 “小白学IT” 博客,请务必保留此出处http://xiaojiejt.blog.51cto.com/12536455/1937412

以上是关于Linux文本处理工具的主要内容,如果未能解决你的问题,请参考以下文章

Linux篇 | 文本处理工具和正则表达式

Linux文本处理工具之grep sed简概

Unix & Linux的文本处理工具 -- grep, sed & awk

Linux文本处理之 grep egrep

Linux篇 | 文本处理工具和正则表达式

linux文本处理三剑客之grep