问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

总结Linux中用于文本处理的awk、sed、grep命令用法

发布网友 发布时间:2024-09-07 02:00

我来回答

1个回答

热心网友 时间:2024-09-29 08:08

awk
基础概念
Awk把文件(或其他方式的输入流, 如重定向输入)看作一个记录集, 把每一行看作一条记录, 把每一行中以空格(或\t,或用户自己指定的分隔符)分割的字符串看作一个字段. 这似乎把文件记录看成数据库. 但是, awk仍然以行为单位逐行处理. 本例子以下面的文件(命名为s.txt)内容做演示:

复制代码

代码如下:

zhangsan 1977 male computer 83
lisi 1989 male math 99
wanglijiang 1990 female chinese 78
xuliang 1977 male economic 89
xuxin 1986 female english 99
wangxuebing 1978 male math 89
lichang 1989 male math 99
wanglijiang 1990 female chinese 78
zhangsansan 1977 male computer 83
langxuebing 1978 male math 89
lisibao 1989 male math 99
xiaobao 1990 female chinese 78

一行中的5个字段分辨表示姓名, 出生年, 性别,科目,分数, 是一个很传统很典型的报表文件.
Awk基本语法: awk pattern1 {command1;command 2; command 3}pattern2 { command }
pattern表示用来过滤记录的模式, 可是是正则表达式, 关系运算表达式, 也可以什么也没有(表示选中所有记录);
每个pattern选中的行记录会被花括号括起来的命令command操作一遍, command之间用;分割. 花括号里面可以什么也没有, 则默认为print输出整行记录. Comamnd可以是输出, 可以是算术运算, 逻辑运算, 循环控制等等.
先看几个例子, 以建立对awk的命令直观的了解.

复制代码

代码如下:

awk /1990/ s.txt



#//直接输出1990年出生的同学;
awk /chinese/{print 语文; print 语文}s.txt
#// 对chinese的课程的行输出两行语文 +;
awk 201{print Yes} s.txt

#//因为200,所以每行输出Yes;
awk 'BEGIN{print "Result of the quiz:\n"}{print}END{print"---------------------------"}' s.txt

结果:
本例有3个花括号,分别对应3个模式, BEGIN和END是特殊模式,分别作用在记录开始前和记录结束后.
变量: 上面说到command可以是算术运算, 所及运算等, 则既然有运算, 就有常量变量, awk可以自定义变量(不需要提前声明, 但最好在BEGIN里面给它初始化). Awk也维护了一组程序变量:

变量

说明

$0

当前记录;

$1, $2, $n

当前记录的字段

FILENAME

当前的文件名

FS

输入字段的分隔符, 可通过-F修改. 如: 先通过sed把空格替换为|,然后管道输送给awk:
sed 's/ /|/g' s.txt | awk -F '|' '/chinese/{print FILENAME, $1, $5}'

NF

当前记录的字段数

NR

当前记录编号

OFS

输出字段分隔符

ORS

输出记录分隔符

RS

记录分隔符, 默认为换行符

给一些例子来说明这些变量的用法:

复制代码

代码如下:

awk $4==chinese{print NR, $1, $4, $5} s.txt #//第四个字段科目为chinese的记录编号, 学生姓名, 科目和成绩.
awk $2~/1990/{print $1} s.txt #//找出1990年出生的学生姓名, ~表示匹配正则表达式
awk $2!~/1990/{print $1} s.txt #//找出不是1990年出生的学生姓名, !~表示不匹配正则表达式
awk $21985{print $1, $2} s.txt #//找出大于1985年出生的学生姓名,年龄
awk END{print total: NR \n---------------- } s.txt
awk BEGIN{goodChinese=0; goodMath=0}($4==chinese||$590){goodChinese++}END{print}

sed
sed '2,5d' file 显示文件file,除去2-5行,但行数超过文件实际行数时不会报错。
sed '/10[1-4]/d' file 显示文件file,除去包含101-104的行。
sed '2,$d' file 显示文件,只显示第一行。sed '2,$!d' file则只显示除第一行外的其它行。
sed '/^ *$/d file 删除文件中的空行。
sed -n '/10[1-4]/p' file
只显示文件file中包含101-104的行。(n和p必须同时使用,否则只有p时显示全部文件并多显示一次找到的行)
sed -n '5p' file 只显示文件的第5行
sed 's/moding/moden/g' file 将moding替换为moden
sed -n 's/^west/north/p' file 将west开头的行替换为north并显示出来。
sed 's/[0-9][0-9][0-9]$/.5/' file 将file文件中以3个数字结尾的行替换为原数字加.5,代表搜索到的字符串。
sed 's/moding/\1en/g file 将mod做为模式1封装在括号里,然后替换。
sed 's/...$//' file 删除每一行的最后三个字符。
sed 's/^...//' file 删除每一行的头三个字符。
sed 's#moding#moden#g' file将moding替换为moden,s后面的#代表搜索串和替换串之间的分界符。
sed -n '/101/,/105/p' file 显示从101的匹配行到105的匹配行。如果只找到101的匹配行,则从101的匹配行到文件末。
sed -n '2,/999/p' file 显示从第2行到匹配行。
sed'/101/,/105/s/$/ 20050119/' file将从101的匹配行到105的匹配行的行末增加 20050119内容。
sed -e '1,3d' -e 's/moding/moden/g'file 先删除文件的1-3行,再进行替换。
sed -e '/^#/!d' file 显示文件以#开头的行。
sed '/101/r newfile' file 在每个匹配行增加文件newfile的内容
sed '/101/w newfile' file 把匹配行写入newfile。
sed '/101/a new text' file 在匹配行后增加一新行。
sed '/101/i' new text' file 在匹配行前增加一新行。
sed '/101/c new text' file 用新行替换匹配行。
sed 'y/abcd/ABCD/' file 将a、b、c、d分别替换为ABCD。
sed '5q' file 显示到第5行时退出。
sed '/101/{ n; s/moding/moden/g; }' file在文件中找到匹配行的后一行(n)再进行替换。
sed '/101/{ s/moding/moden/g; q; }' file在文件中找到第一个匹配行后进行替换后再退出。
sed -e '/101/{ h; d; }' -e '/104/{ G; }'file 在文件中找到与101匹配行后先存在一个缓存中,再放在与104匹配行后。
sed -e '/101/{ h; d; }' -e '/104/{ g; }'file 在文件中找到与101匹配行后先存在一个缓存中,再替代104的匹配行。
sed -e '/101/h' -e '$G' file 将最后一个匹配行放在文件末。
sed -e '/101/h' -e '$g' file 将最后一个匹配行替换文件末行。
sed -e '/101/h' -e '/104/x' file 在文件中找到与101匹配行后先存在一个缓存中,再与104的匹配行进行互换。
echo ltr 1.txt | seds/^.* // 找出文件名

grep
常用的grep选项
-c 只输出匹配行的计数。// 这条有时候很有用, 不需要再 | wc -l
-i 不区分大小写(只适用于单字符)。
-h 查询多文件时不显示文件名。
-l 查询多文件时只输出包含匹配字符的文件名。
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信息。
-v 显示不包含匹配文本的所有行。
例子

复制代码

代码如下:

grep -v "Sort" tab2

显示不包含匹配文本的所有行

复制代码

代码如下:

grep -n "Sort" tab2

显示匹配行及行号

复制代码

代码如下:

grep -c "Sort" tab2

只输出匹配行的计数
精确匹配:
复制代码

代码如下:

grep "01"" tab2

复制代码

代码如下:

grep -in "code" tab2

忽略大小写
多次过滤

复制代码

代码如下:

grep -in "code" tab2 | grep "02"

补充说明,grep 家族还包括fgrep和egrep。fgrep是fix grep, 允许查找字符串而不是一个模式,运算速度快,适合于从大量数据中进行检索;egrep是扩展grep,支持基本及扩展的正则表达式,可用()及|等,但不支持q模式范围的应用及与之相对应的一些更加规范的模式。

复制代码

代码如下:

echo aAA123bbb |egrep '[0-9]*'

复制代码

代码如下:

echo AAA123bbb | egrep -i '^a'
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
会计中级什么时候拿证 会计中级职称什么时候领取 手机中毒后恢复出厂设置就可以了吗? 手机中病毒后如何清除? 做代购初期怎么找客源,微商代购怎么找精准客 ...代购,都是阿迪耐克正品。怎么才能把微商做好。 做微商和代购,有哪些引流获客的方法? 250㎜的水泥撑棍一捆多少根? 吊顶一平要多少丝杠 ...断开电源,一端接地,这个时候把极板远离,为什么是两极板电压变大而... 有看过一部觉得全球最恐怖的鬼片,报片名来 淋巴细胞百分比降低是艾滋病吗 淋巴细胞百分比较低是什么意思? 淋巴细胞百分比低说明什么 杜甫长什么样子 工伤的变更情况说明是什么,需要盖劳务章? 如何解释工伤保险未能及时缴纳? 魔法少女武斗祭怎么下载,下载完了打不开怎么回事 婴幼儿如何换奶粉? 求魔法少女武斗 新生儿更换奶粉需要注意什么 魔法少女绮罗与纱罗② 游戏安装与卸载 肚脐里面有白色的东西是什么 求魔法少女小圆携带版存档 猜谜语:保皇 (球类用语)谜底是什么? 肚脐挖出白色膏状东西是怎么回事 肚脐眼白色分泌物是什么原因造成的 杭州到四川成都多少公里_杭州飞四川几小时 qq里的自动回复怎么写最有气质 究极魔法少女绝対☆珍贵的姐姐故事情节 求类似【伪恋】一样,两人一开始很讨厌对方,后来慢慢喜欢对方的动漫 哪些歌手是电音 有没有开始男女主角见面就打后来慢慢的俩人就互相喜欢上了的动漫 继发性肝癌手术后患者能活多久 继发性肝癌可以治愈吗 男女主角原本一见面就打,后来男主角慢慢的喜欢上了女主,还经常的强吻... 继发性肝癌可以治愈吗? 合肥大兴附近的游泳馆有吗? clannad 智代篇的结尾歌是什么歌??? 结研所到北京大兴第三体校怎么乘车。 求求求 跪求下载 叫兽我的2008和原曲 怀孕后谷丙转氨酶偏高的原因 孕期谷丙转氨酶偏高的原因 谷丙转氨酶144,谷草转氨酶50,谷氨转肽酶121.1,胆碱酯酶12805,HBSAB... 请问一下,如果要把番薯和白粥一起烧。是一起放下去烧?还是等粥七八分... 冰岛普洱茶特点及鉴别方式的6点认识 走,带你去看“黄片”!关于普洱茶黄片,这篇终于把它讲清楚了! 温馨提示牌的作用是什么 被猫咬了一星期后打针有用吗 自家养的猫咬着了没流血已经过了一个星期了还需要打针吗