300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > Linux文本三剑客--grep sed awk

Linux文本三剑客--grep sed awk

时间:2020-02-17 03:19:27

相关推荐

Linux文本三剑客--grep sed awk

Linux文本三剑客–grep、sed、awk

文章目录

Linux文本三剑客--grep、sed、awk1、grep1.1什么是grep1.2使用grep命令格式命令参数基本正则表表达式匹配字符匹配次数位置锚点:定位出现的位置扩展正则表达式2.sed2.1什么是sed2.2使用sed命令格式常用选项options地址定界编辑命令commandsed用法演示地址界定演示编辑命令command演示sed高级编辑命令① 案例:倒序输出文本内容① 显示偶数行② 倒序显示③ 显示奇数行④ 显示最后一行⑤ 每行之间加空行⑥ 把每行内容替换成空行⑦ 确保每一行下面都有一个空行3.awk什么是awk使用awk语法常用命令选项(1)格式自定义变量(1)-v var=value(2)在program 中直接定义printf命令(1)格式化输出(2)格式符:与item 一一对应(3)修饰符:放在%c[/d/e/f...]之间操作符**格式演示(1)模式匹配符(2)逻辑操作符(3)条件表达式(三目表达式)grep sed awk比较

三者功能都是处理文本,但是侧重点各不相同,其中awk功能最强大,最复杂。grep更适合单冲的查找或匹配文本,sed更是适合编辑匹配到的文本,awk更适合格式化文本,对文本进行较复杂格式处理。

1、grep

1.1什么是grep

Linux系统中grep命令是一种强大的文本搜索工具,他能使用正则表达式搜索文本,并把匹配的行打印出来(匹配到的标红)。grep全程是Global regular expression print,表示全局正则表达式版本。

grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2.

1.2使用grep

命令格式

grep [option] pattern file

命令参数

-A<显示行数>:除了显示符合范本样式的那一列之外,并显示该行之后的内容。-B<显示行数>:除了显示符合样式的那一行之外,并显示该行之前的内容。-C<显示行数>:除了显示符合样式的那一行之外,并显示该行之前后的内容。-c:统计匹配的行数-e :实现多个选项间的逻辑or 关系-E:扩展的正则表达式-f FILE:从FILE获取PATTERN匹配-F :相当于fgrep-i --ignore-case #忽略字符大小写的差别。-n:显示匹配的行号-o:仅显示匹配到的字符串-q: 静默模式,不输出任何信息-s:不显示错误信息。-v:显示不被pattern 匹配到的行,相当于[^] 反向匹配-w :匹配 整个单词

基本正则表表达式

匹配字符

. 匹配任意单个字符,不能匹配空行[] 匹配指定范围内的任意单个字符[^] 取反[:alnum:] 或 [0-9a-zA-Z][:alpha:] 或 [a-zA-Z][:upper:] 或 [A-Z][:lower:] 或 [a-z][:blank:] 空白字符(空格和制表符)[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)[:cntrl:] 不可打印的控制字符(退格、删除、警铃…)[:digit:] 十进制数字 或[0-9][:xdigit:]十六进制数字[:graph:] 可打印的非空白字符[:print:] 可打印字符[:punct:] 标点符号

匹配次数

***** 匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配.*任意前面长度的任意字符,不包括0次?匹配其前面的字符0 或 1次+匹配其前面的字符至少1次{n} 匹配前面的字符n次{m,n} 匹配前面的字符至少m 次,至多n次{,n} 匹配前面的字符至多n次{n,} 匹配前面的字符至少n次

位置锚点:定位出现的位置

^ 行首锚定,用于模式的最左侧$ 行尾锚定,用于模式的最右侧^PATTERN$,用于模式匹配整行^$ 空行^[[:space:]].*$ 空白行< 或 \b 词首锚定,用于单词模式的左侧> 或 \b 词尾锚定;用于单词模式的右侧<PATTERN>

扩展正则表达式

(1)字符匹配:

. 任意单个字符[] 指定范围的字符[^] 不在指定范围的字符次数匹配:* :匹配前面字符任意次? : 0 或1次+ :1 次或多次{m} :匹配m次 次{m,n} :至少m ,至多n次

(2)位置锚定:

^ : 行首$ : 行尾<, \b : 语首>, \b : 语尾分组:()后向引用:\1, \2, …

2.sed

2.1什么是sed

sed是一种流编辑器,一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为模式空间(patternspace),接着用sed命令处理缓冲器中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使用例如‘D’的特殊命令,那么会在两个循环之间清空模式空间,但不会清空保留空间,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输入或-i

功能:主要用来自动编辑一个或多个文件,简化对文件的反复操作。

2.2使用sed

命令格式

sed [options] '[地址定界] command' file(s)

常用选项options

-n:不输出模式空间内容到屏幕,即不自动打印,只打印匹配到的行**-e:**多点编辑,对每行处理时,可以有多个Script-f:把Script写到文件当中,在执行sed时-f 指定文件路径,如果是多个Script,换行写-r:支持扩展的正则表达式-i:直接将处理的结果写入文件-i.bak:在将处理的结果写入文件之前备份一份

地址定界

不给地址:对全文进行处理单地址: #: 指定的行/pattern/:被此处模式所能够匹配到的每一行 地址范围: #,##,+#/pat1/,/pat2/#,/pat1/ ~:步进 sed -n‘1~2p’只打印奇数行 (1~2 从第1行,一次加2行)sed -n‘2~2p’只打印偶数行

编辑命令command

d:删除模式空间匹配的行,并立即启用下一轮循环

p:打印当前模式空间内容,追加到默认输出之后

a:在指定行后面追加文本,支持使用\n实现多行追加

i:在行前面插入文本,支持使用\n实现多行追加

c替换行为单行或多行文本,支持使用\n实现多行追加

w:保存模式匹配的行至指定文件

r:读取指定文件的文本至模式空间中匹配到的行后

=:为模式空间中的行打印行号

!:模式空间中匹配行取反处理

s///

加g表示行内全局替换;

在替换时,可以加一下命令,实现大小写转换

\l:把下个字符转换成小写。

\L:把replacement字母转换成小写,直到\U或\E出现。

\u:把下个字符转换成大写。

\U:把replacement字母转换成大写,直到\L或\E出现。

\E:停止以\L或\U开始的大小写转换

sed用法演示

[root@along ~]# cat demoaaabbbbAABBCCDD[root@along ~]# sed "/aaa/p" demo #匹配到的行会打印一遍,不匹配的行也会打印aaaaaabbbbAABBCCDD[root@along ~]# sed -n "/aaa/p" demo #-n不显示没匹配的行aaa[root@along ~]# sed -e "s/a/A/" -e "s/b/B/" demo #-e多点编辑AaaBbbbAABBCCDD[root@along ~]# cat sedscript.txts/A/a/g[root@along ~]# sed -f sedscript.txt demo #-f使用文件处理aaabbbbaaBBCCDD[root@along ~]# sed -i.bak "s/a/A/g" demo #-i直接对文件进行处理[root@along ~]# cat demoAAAbbbbAABBCCDD[root@along ~]# cat demo.bakaaabbbbAABBCCDD

地址界定演示

[root@along ~]# cat demoaaabbbbAABBCCDD[root@along ~]# sed -n "p" demo #不指定行,打印全文aaabbbbAABBCCDD[root@along ~]# sed "2s/b/B/g" demo #替换第2行的b->BaaaBBBBAABBCCDD[root@along ~]# sed -n "/aaa/p" demoaaa[root@along ~]# sed -n "1,2p" demo #打印1-2行aaabbbb[root@along ~]# sed -n "/aaa/,/DD/p" demoaaabbbbAABBCCDD[root@along ~]# sed -n "2,/DD/p" demobbbbAABBCCDD[root@along ~]# sed "1~2s/[aA]/E/g" demo #将奇数行的a或A替换为EEEEbbbbEEBBCCDD

编辑命令command演示

[root@along ~]# cat demoaaabbbbAABBCCDD[root@along ~]# sed "2d" demo #删除第2行aaaAABBCCDD[root@along ~]# sed -n "2p" demo #打印第2行bbbb[root@along ~]# sed "2a123" demo #在第2行后加123aaabbbb123AABBCCDD[root@along ~]# sed "1i123" demo #在第1行前加123123aaabbbbAABBCCDD[root@along ~]# sed "3c123\n456" demo #替换第3行内容aaabbbb123456[root@along ~]# sed -n "3w/root/demo3" demo #保存第3行的内容到demo3文件中[root@along ~]# cat demo3AABBCCDD[root@along ~]# sed "1r/root/demo3" demo #读取demo3的内容到第1行后aaaAABBCCDDbbbbAABBCCDD[root@along ~]# sed -n "=" demo #=打印行号123[root@along ~]# sed -n '2!p' demo #打印除了第2行的内容aaaAABBCCDD[root@along ~]# sed 's@[a-z]@\u&@g' demo #将全文的小写字母替换为大写字母AAABBBBAABBCCDD

sed高级编辑命令

h:把模式空间中的内容覆盖至保持空间中H:把模式空间中的内容追加至保持空间中g:从保持空间取出数据覆盖至模式空间G:从保持空间取出内容追加至模式空间x:把模式空间中的内容与保持空间中的内容进行互换n:读取匹配到的行的下一行覆盖 至模式空间N:读取匹配到的行的下一行追加 至模式空间d:删除模式空间中的行D:删除 当前模式空间开端至\n 的内容(不再传 至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed

① 案例:倒序输出文本内容

[root@along ~]# cat num.txtOneTwoThree[root@along ~]# sed '1!G;h;$!d' num.txtThreeTwoOne1!G 第一行不执行G命令,从第二行开始执行$!d 最后一行不删除

③ 总结模式空间与保持空间关系:

保持空间是模式空间一个临时存放数据的缓冲区,协助模式空间进行数据处理

(3)演示

① 显示偶数行

[root@along ~]# seq 9 |sed -n 'n;p'2468

② 倒序显示

[root@along ~]# seq 9 |sed '1!G;h;$!d'987654321

③ 显示奇数行

[root@along ~]# seq 9 |sed 'H;n;d'13579

④ 显示最后一行

[root@along ~]# seq 9| sed 'N;D'9

⑤ 每行之间加空行

[root@along ~]# seq 9 |sed 'G'123456789---

⑥ 把每行内容替换成空行

[root@along ~]# seq 9 |sed "g"---

⑦ 确保每一行下面都有一个空行

[root@along ~]# seq 9 |sed '/^$/d;G'123456789

3.awk

什么是awk

awk是一种编程语言,用于在Linux下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件、其他命令的输出。它支持用户自定义函数和动态正则表达式等先进功能。awk有很多内建的功能,比如数组、函数等。

使用awk

语法

awk` `[options] ``'program'` `var=value ``file``…``awk` `[options] -f programfile var=value ``file``…``awk` `[options] ``'BEGIN{ action;… } pattern{ action;… } END{ action;… }'` `file` `...

常用命令选项

-F fs:fs指定输入分隔符,fs可以是字符串或正则表达式。-v var=value:赋值一个用户定义变量,将外部变量传递给awk-f scripfile:从脚本文件中读取awk命令

awk变量

变量:内置和自定义变量,每个变量前加-v命令选项

(1)格式

FS输入字段分隔符默认为空白字符OFS输出字段分隔符,默认为空白字符RS :输入记录分隔符,指定输入时的换行符,原换行符仍有效ORS :输出记录分隔符,输出时用指定符号代替换行符NF:字段数量,共有多少字段,NF引用最后一列,NF引用最后一列,NF引用最后一列,(NF-1)引用倒数第2列NR行号,后可跟多个文件,第二个文件行号继续从第一个文件最后行号开始FNR :各文件分别计数, 行号,后跟一个文件和NR一样,跟多个文件,第二个文件行号从1开始FILENAME :当前文件名ARGC :命令行参数的个数ARGV :数组,保存的是命令行所给定的各参数,查看参数

[root@along ~]# cat awkdemohello:worldlinux:redhat:lalala:hahahaalong:love:youou[root@along ~]# awk -v FS=':' '{print $1,$2}' awkdemo #FS指定输入分隔符hello worldlinux redhatalong love[root@along ~]# awk -v FS=':' -v OFS='---' '{print $1,$2}' awkdemo #OFS指定输出分隔符hello---worldlinux---redhatalong---love[root@along ~]# awk -v RS=':' '{print $1,$2}' awkdemohelloworld linuxredhatlalalahahaha alongloveyou[root@along ~]# awk -v FS=':' -v ORS='---' '{print $1,$2}' awkdemohello world---linux redhat---along love---[root@along ~]# awk -F: '{print NF}' awkdemo243[root@along ~]# awk -F: '{print $(NF-1)}' awkdemo #显示倒数第2列hellolalalalove[root@along ~]# awk '{print NR}' awkdemo awkdemo112345[root@along ~]# awk END'{print NR}' awkdemo awkdemo15[root@along ~]# awk '{print FNR}' awkdemo awkdemo112312[root@along ~]# awk '{print FILENAME}' awkdemoawkdemoawkdemoawkdemo[root@along ~]# awk 'BEGIN {print ARGC}' awkdemo awkdemo13[root@along ~]# awk 'BEGIN {print ARGV[0]}' awkdemo awkdemo1awk[root@along ~]# awk 'BEGIN {print ARGV[1]}' awkdemo awkdemo1awkdemo[root@along ~]# awk 'BEGIN {print ARGV[2]}' awkdemo awkdemo1awkdemo1

自定义变量

(1)-v var=value

① 先定义变量,后执行动作print

[root@along ~]# awk -v name="along" -F: '{print name":"$0}' awkdemoalong:hello:worldalong:linux:redhat:lalala:hahahaalong:along:love:you

② 在执行动作print后定义变量

[root@along ~]# awk -F: '{print name":"$0;name="along"}' awkdemo:hello:worldalong:linux:redhat:lalala:hahahaalong:along:love:you

(2)在program 中直接定义

可以把执行的动作放在脚本中,直接调用脚本 -f

[root@along ~]# cat awk.txt{name="along";print name,$1}[root@along ~]# awk -F: -f awk.txt awkdemoalong helloalong linuxalong along

printf命令

(1)格式化输出

printf` `"FORMAT"``, item1,item2, ...

① 必须指定FORMAT

不会自动换行,需要显式给出换行控制符,\n

③ FORMAT 中需要分别为后面每个item 指定格式符

(2)格式符:与item 一一对应

%c: 显示字符的ASCII码

%d, %i: 显示十进制整数

%e, %E: 显示科学计数法数值

%f :显示

为浮点数,小数%5.1f,带整数、小数点、整数共5位,小数1位,不够用空格补上

%g, %G :以科学计数法或浮点形式显示数值

%s :显示字符串;例:%5s最少5个字符,不够用空格补上,超过5个还继续显示

%u :无符号整数

%%: 显示% 自身

(3)修饰符:放在%c[/d/e/f…]之间

#[.#]:第一个数字控制显示的宽度;第二个# 表示小数点后精度,%5.1f-:左对齐(默认右对齐) %-15s+:显示数值的正负符号 %+d

操作符**

格式

算术操作符:

x+y, x-y, x*y, x/y, x^y, x%y-x: 转换为负数+x: 转换为数值

字符串操作符:没有符号的操作符,字符串连接

赋值操作符:

=, +=, -=, *=, /=, %=, ^=++, –

比较操作符:

==, !=, >, >=, <, <=

模式匹配符:~ :左边是否和右边匹配包含 !~ :是否不匹配

逻辑操作符:与&& ,或|| ,非!

函数调用: function_name(argu1, argu2, …)

条件表达式(三目表达式):

selector

?

if-true-expression

:

if-false-expression

注释:先判断selector,如果符合执行 ? 后的操作;否则执行 : 后的操作

演示

(1)模式匹配符

---查询以/dev开头的磁盘信息[root@along ~]# df -h |awk -F: '$0 ~ /^\/dev/'/dev/mapper/cl-root 17G 7.3G 9.7G 43% //dev/sda1 1014M 121M 894M 12% /boot---只显示磁盘使用状况和磁盘名[root@along ~]# df -h |awk '$0 ~ /^\/dev/{print $(NF-1)"---"$1}'43%---/dev/mapper/cl-root12%---/dev/sda1---查找磁盘大于40%的[root@along ~]# df -h |awk '$0 ~ /^\/dev/{print $(NF-1)"---"$1}' |awk -F% '$1 > 40'

(2)逻辑操作符

[root@along ~]# awk -F: '$3>=0 && $3<=1000 {print $1,$3}' /etc/passwdroot 0bin 1[root@along ~]# awk -F: '$3==0 || $3>=1000 {print $1}' /etc/passwdroot[root@along ~]# awk -F: '!($3==0) {print $1}' /etc/passwdbin[root@along ~]# awk -F: '!($0 ~ /bash$/) {print $1,$3}' /etc/passwdbin 1daemon 2

(3)条件表达式(三目表达式)

[root@along ~]# awk -F: '{$3 >= 1000?usertype="common user":usertype="sysadmin user";print usertype,$1,$3}' /etc/passwdsysadmin user root 0common user along 1000

grep sed awk比较

grep:文本过滤器,如果仅仅是过滤文本,可使用grep,其效率要比其他的高很多sed:stream editor,流编辑器,默认只处理模式空间,不处理原数据awk:报告生成器,格式化以后显示。如果对处理的数据需要生成报告之类的信息,或者你处理的数据是按列进行处理的,最好使用awk

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。