- 爱易网页
-
Linux
- Linux常用命令之文本分析(6)
日期:2014-05-16 浏览次数:20685 次
Linux常用命令之文本分析(六)
1.grep
cat file | grep key :在file中检索包含key的行
key可以是正则,特殊字符需要转意
grep -E 正则表达式:
示例:cat /etc/services | grep -E "^#" #打印所有注释行
egrep:一次查询匹配多个内容
例如:egrep '2020|892|10005' /etc/services
2.sed
sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
格式:sed [options] 'command' file(s)
实例:
1)删除:d命令
sed '2d' example-----删除example文件的第二行。
sed '2,$d' example-----删除example文件的第二行到末尾所有行。
sed '$d' example-----删除example文件的最后一行。
sed '/test/'d example-----删除example文件所有包含test的行。
2)替换:s命令
sed 's/test/mytest/g' example-----在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest。
sed -n 's/^test/mytest/p' example-----(-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。
sed 's/^192.168.0.1/&localhost/' example-----&符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加 localhost,变成192.168.0.1localhost。
sed -n 's/\(love\)able/\1rs/p' example-----love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。
sed 's#10#100#g' example-----不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有10替换成100。
3)选定行的范围:逗号
sed -n '/test/,/check/p' example-----所有在模板test和check所确定的范围内的行都被打印。
例子:sed -n '/38685518/,/38685524/p' 123456.csv 按连续内容截取
grep也有类似方法:
countnum=$[ $endnum - $startnum + 1 ]
grep "$startnum" $file -A $countnum
sed -n '5,/^test/p' example-----打印从第五行开始到第一个包含以test开始的行之间的所有行。
sed -n '1,100p' example -----打印第1行到第100百行
sed '/test/,/check/s/$/sed test/' example-----对于模板test和west之间的行,每行的末尾用字符串sed test替换。
4)多点编辑:e命令
sed -e '1,5d' -e 's/test/check/' example-----(-e)选项允许在同一行里执行多条命令。如例子所示,第一条命令删除1至5行,第二条命令用check替换test。命令的执 行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。
sed --expression='s/test/check/' --expression='/love/d' example-----一个比-e更好的命令是--expression。它能给sed表达式赋值。
3.awk
awk是一个强大的文本分析工具,在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
格式:awk [-F field-separator] 'commands' input-file(s)
其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。
在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。
示例:
1)如果只是显示/etc/passwd的账户
cat /etc/passwd |awk -F ':' '{print $1}'
2)如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以tab键分割
cat /etc/passwd |awk -F ':' '{print $1"\t"$7}'
3)如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割
a.而且在所有行添加列名name,shell
cat /etc/passwd |awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7}'
b.在最后一行添加"blue,/bin/nosh"。
cat /etc/passwd |awk -F ':' '{print $1","$7} END {print "blue,/bin/nosh"}'
c.ab前后都加
cat /etc/passwd |awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "blue,/bin/nosh"}'
4)搜索/etc/passwd有root关键字的所有行
awk -F: '/root/' /etc/passwd #正则
5)搜索/etc/passwd有root关键字的所有行,并显示对应的shell
awk -F: '/root/{print $7}' /etc/passwd
A.awk内置变量
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数