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文本处理工具的主要内容,如果未能解决你的问题,请参考以下文章