搞Linux开发,经常会遇到对文本内容进行查找、编辑甚至进行某些分析处理的情况,比如说添加开机启动项、添加全局环境变量、定制化显示等。如果这些都采用Python脚本进行处理,那么未免有些小题大做。
这里主要跟大家介绍一下,Linux处理文本的三剑客:grep、sed和awk。有了这三个命令,妈妈再也不用担心我的文本处理啦~
grep
grep命令主要用于文本内容的查找。它支持正则表达式查找,命令格式为:
grep [option] pattern filename
比如说,在filename文本中查找包含”text”的行:
grep "text" filename
这条命令默认只输出匹配的文本行,当option为-o时,命令行只输出匹配的文本,而option为-v时,命令行只输出没有匹配的文本行。
另外,如果查找运行中关于mysql的进程,可以在终端输入:
ps -ef | grep mysql
sed
sed命令主要用于文本内容的编辑。默认只处理模式空间,不处理原数据,而且sed是针对一行行数据来进行处理的。
sed的命令格式为:
sed [option] 'command' filename
其中option常用选项有以下:
-n:使用安静(silent)模式。
在一般sed的用法中,所有来自stdin的数据一般都会被列出到终端上。
但如果加上-n参数后,则只有经过sed特殊处理的那一行(或者动作)才会被列出来。
-e:直接在命令列模式上进行sed的动作编辑。
-i:直接修改读取的文件内容,而不是输出到终端。
命令分为以下几种:
a:追加,a的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
i:插入,i的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
d:以行为单位的删除
c:以行为单位的替换,c的后面可以接字串
s:在行中搜寻并替换
p:以行为单位的显示,通常p会与参数sed -n一起运行
比如说,在filename文本最后一行追加hello world:
sed '$a hello world' filename
而在filename文本第一行插入hello world:
sed '1i hello world' filename
如果既要在最后一行追加hello world,又要在第一行插入hello world:
sed -e '$a hello world' -e '1i hello world' filename
另外,sed比较常用的就是文本替换,它也支持正则表达式,功能强大。比如,表示将filename文本的每行中的oldstring替换为newstring,就可以使用如下命令:
sed 's/oldstring/newstring/g' filename
awk
awk命令主要用于文本内容的分析处理。如果对处理的数据需要生成报告之类的信息,或者处理的数据是按列进行处理的,最好使用awk。awk读入有’\n’换行符分割的一条记录,然后将记录按指定的域分隔符划分域,$0则表示所有域,$1表示第一个域,$n表示第n个域。
比如说,以”:”分隔filename文本的每一行并且打印第一列
awk -F ':' '{print $1}' filename
打印可以采用print函数,如果需要格式化打印,则类似C语言一样采用printf函数。
sed和awk定制化显示举例
这里,我们可以制作一个文本my.txt,内容为:
This is my cat, my cat's name is betty
This is my dog, my dog's name is frank
This is my fish, my fish's name is george
This is my goat, my goat's name is adam
需要显示的结果为:
cat:betty
dog:frank
fish:george
goat:adam
如果采用sed,可以输入
sed 's/This is my \(.*\),.*is \(.*\)/\1:\2/g' my.txt
如果采用awk,则有两种方法
awk -F '[ ,]' '{print $4,$10}' OFS=":" my.txt
awk -F '[ ,]' '{printf("%s:%s\n",$4,$10)}' my.txt
转载请注明:宁哥的小站 » 文本处理三剑客:grep、sed和awk命令介绍