请选择 进入手机版 | 继续访问电脑版

[LINUX] 总结Linux中用于文本处理的awk、sed、grep下令 用法

  [复制链接]
查看239 | 回复60 | 2021-9-4 22:59:24 | 显示全部楼层 |阅读模式

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 ‘20>1{print “Yes”}’ s.txt #//由于 20>0,以是 每行输出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 ‘$2>”1985”{print $1, $2}’ s.txt #//找出大于1985年出生的门生 姓名,年龄
awk ‘END{print “total: ” NR ”\n----------------” }’ s.txt
awk ‘BEGIN{goodChinese=0; goodMath=0}($4==”chinese”||$5>90){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 | sed‘s/^.* //’ 找出文件名

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'


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

avatar 刘和谐1 | 2021-9-13 03:49:11 | 显示全部楼层
顶一下,收藏了!
回复

使用道具 举报

avatar 素身素 | 2021-9-13 20:45:31 | 显示全部楼层
这么版块的帖子越来越有深度了!
回复

使用道具 举报

avatar zmhg799417 | 2021-9-15 10:41:00 | 显示全部楼层
admin楼主最近很消极啊!
回复

使用道具 举报

avatar 天然悠然牌 | 2021-9-17 14:26:16 | 显示全部楼层
admin楼主,您忘记吃药了吧?
回复

使用道具 举报

avatar 六月清晨搅 | 2021-9-18 08:18:14 | 显示全部楼层
怪事年年有,今年特别多!
回复

使用道具 举报

avatar 刺客325 | 2021-9-19 13:48:52 | 显示全部楼层
论坛的人气越来越旺了!
回复

使用道具 举报

avatar 爱之关怀阿飞米 | 2021-9-20 09:35:27 | 显示全部楼层
帖子很有深度!
回复

使用道具 举报

avatar 是哒hhh | 2021-9-27 06:09:14 | 显示全部楼层
顶顶更健康!
回复

使用道具 举报

avatar 城外606 | 2021-9-29 17:51:24 | 显示全部楼层
很经典,收藏了!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则