awk(报告生成器),grep(文本过滤器),sed(流编辑器)使用入门-阿里云开发者社区

开发者社区> 开发与运维> 正文

awk(报告生成器),grep(文本过滤器),sed(流编辑器)使用入门

简介: 三剑客 linux下的文本三剑客 grep egrep,grep,fgrep 文本查找的需要 grep:根据模式搜索文本,并将符合模式的文本行显示出来。
三剑客

linux下的文本三剑客

grep

egrep,grep,fgrep 
文本查找的需要
grep:根据模式搜索文本,并将符合模式的文本行显示出来。
pattern:文本符和正则表达式的元字符组合而成的匹配条件

grep [option] "pattern" file 
grep root /etc/passwd

-i:忽略大小写 
--color:匹配的字符高亮显示  alias
alias  grep='grep --color'
-v:反向查找 
-o:只显示被模式匹配的字符串(不显示行)

globbing

*:任意长度的任意字符
?:任意单个字符
[]:任意一个字符
[^]:其中任意一个非 

正则表达式:Regular ExPression,REGEXP

元字符:
.:匹配任意单个字符
[]:匹配指定范围内的任意字符
[^]:匹配指定范围内的任意单个字符
[:digit:][:lower:][:upper:] []

字符匹配次数:
*:表示匹配前面的字符任意次(0-inf)
   a*b 
   a.*b
.*:表示任意长度的,任意字符
工作在贪婪模式 
\?:匹配其前面的字符一个或0次。
    部分匹配 
  a?b 
\{m,n\}:匹配其前的字符至少m,至多n次。
   \{1,\}
  \{0,3\}
  a\{1,3\}
  a.\{1,3\}

位置锚定:

^:锚定行首,此字符后面的任意内容必须出现在行首。
grep "^root" /etc/passwd 

$:锚定行尾,此字符前面的任意内容必须出现在行尾。

grep "bash$" /etc/passwd 
^$:空白行 
grep '^$' /etc/passwd 

数字:

[0-9]:

grep "[[:space:]][[:digit:]]$" 

r555t 

锚定单词:

\<或\b:其后面的任意字符必须出现在行首
\>或\b:其前面的任意字符必须出现在行尾。

This is root.
The user is mroot
rooter is dogs name.
chroot is a command.
grep "root\>" test.txt 
grep "\<root" test.txt 
grep "\<root\>" test.txt  

分组:

\(\)
\(ab\)* :ab一个整体 
  
  后向引用
  
He love his lover.
She like her liker.
He  love his liker.
She like her lover.

grep 'l..e*l..e*' text.txt 
grep "l..e.*\1" text.txt
grep "\(l..e\)" 

\1:调用第一个左括号以及与之对应的右括号之间的内容。
\2:
\3:

/etc/inittab 
grep '\([0-90]\).*\1$'  /etc/inittab 

REGEXP:regular Expresssion

pattern:文本的过滤条件

正则表达式:
basic REGEXP:基本正则表达式
Extent REGEXP :扩展正则表达式

基本正则表达式

.
[]
[^]

次数匹配:
*:
\?:0或1次
\{m,n\}:至少m次,至多n次

.*:

锚定:
^:
$:
\<,\b: 
\>,\b:

\(\)
\1,\2....

grep:使用基本的正则表达式定义的模式来过滤文本的命令:

-i:忽略大小写 
-v 
-o 
--color 

-E 支持扩展的正则表达式 
-A  # :显示匹配行及以后多少行也显示 
  after 
-B:显示匹配行以及前面的n行
   before 
-C:显示匹配行以及前后的n行
   contest 
grep -A 2 ""  file 


扩展正则表达式:
   贪婪模式

字符匹配:
.
[]
[^]

次数匹配:
*:
?:
+:匹配其前面的字符至少一次
{m,n}

位置锚定:
^
$
\<
\>

分组:
():分组
\1,\2,\3.....

或者:
a|b  or 

C|cat: 
(C|c)at: 

grep --color -E '^[[:space:]]+' /boot/grub/grub.conf 

grep -E = egrep 

egrep --color '\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-5][0-9]|25[0-5])\>' 

(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-5][0-9]|25[0-5])\>\.){3}'\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-5][0-9]|25[0-5])\>\.'

IPV4:
5类:
A B C D E 
A:1-127 
B:128-191 
C: 192--223 

\<[1-9]|[1-9][0-9]|1[0-9]{2}|2[01][0-9]|22[0-30]\>

sed(流编辑器)

sed基本用法:

sed:stream Editor 
行编辑器 
   文本编辑器 
   逐行处理文本 
  
全屏编辑器:vim 
 
内存空间:模式空间 
sed 模式空间 
匹配模式空间后,进行操作,将结果输出。仅对模式空间中的数据进行处理,而后,处理结束,将模式空间打印至屏幕;

默认sed不编辑原文件,仅对模式空间中的数据进行处理。

sed [option] [sed-scripts]

option:
-n:静默模式 
-i:直接修改原文件
-e scripts -e script:可以同时执行多个脚本。
-f /path/to/sed_scripts  命令和脚本保存在文件里调用。
  sed -f /path/to/scripts  file 
-r:表示使用扩展的正则表达式。
   只是进行操作,不显示默认模式空间的数据。

comamnd:

address:指定处理的行范围

sed 'addressCommand' file ... 
对符合地址范围进行操作。
Address: 
1.startline,endline 
 比如1,100
   $:最后一行
2./RegExp/ 
  /^root/
3./pattern1/,/pattern2/ 
  第一次被pattern匹配到的行开始,至第一次pattern2匹配到的行结束,这中间的所有行。
4.LineNumber 
   指定行 
5.startline,+N 
 从startline开始,向后的N行。
 
Command:
 d:删除符合条件的行。
     sed '3,$d' /etc/fstab
     sed '/oot/d' /etc/fstab 
注意:模式匹配,要使用 // 
    sed '1d' file 
p:显示符合条件的行 
 sed '/^\//d' /etc/fstab 
 sed '/^\//p' /etc/fstab 
   会显示两次
    先显示P匹配,再显示所有模式空间的数据。
a \string:在指定的行后面追加新行,内容为"string"
sed '/^\//a \# hello world' /etc/fstab 
添加两行:
sed '/^\//a \#hello world \n #hi' /etc/fstab 

i \sting:在指定行的前面添加新行,内容为string。

r file:将指定的文件的内容添加在指定行后面。
  sed '2r /etc/issue'   /etc/fstab 
  sed '$r /etc/issue' /etc/fstab 

w file:将地址指定的范围的内容另存至另一文件中。
 sed '/oot/w /tmp/oot.txt' /etc/fstab 
 
s/pattern/string/:查找并替换 
     sed  's/oot/OOT/'  /etc/fstab 
sed 's/^\//#/' /etc/fstab 
sed 's/\//#/'/etc/fstab 仅替换每一行第一次被模式匹配的串。
  加修饰符 
   g:全局替换 
   i:忽略大小写 
 sed 's/\//#/g'/etc/fstab
 
 s///:s###
 s@@@
 
sed 's#+##' 

后向引用

l..e:like----->liker 
     love----->lover 
     
sed 's#l..e#&r#' file
&:表示模式匹配的引用 

sed 's#l..e#\1r#' file 

like---->Like
love---->Love 
sed 's#l\(..e\)#L\1#g' file 


history |sed 's#[[:space:]]##g'
history | sed 's#^[[:space:]]##g'

sed ''dirname

例子

 1.删除/etc/grub.conf文件中行首的空白符;
 sed  's/^[[:space:]]+//g' /etc/grub.conf 
 2.替换/etc/inittab文件中"id:3:initdefault:"一行中的3
 sed 's#id:3:init#id:5:initd#'
 sed 's@\(id:\)[0-9]\(:initdefault:\)@\15\2@g' /etc/inittab 
 3.删除/etc/inittab文件中的空白行。
  sed '/^$/d' /etc/inittab
4.删除/etc/inittab文件中开头的#号
sed 's/^#//'  
5.删除莫文件中开头的#号以及空白行。
sed 's/^[[:space:]]+//g' 
6.删除某文件中以空白字符后面跟#类的行中开头的空白字符以及#
sed -r 's/^[[:space:]]+#//g' 
7.取出一个文件路径的目录名称
echo '/etc/rc.d'|sed -r 's@^(/.*/)[^/]+/?@\1@g'

awk(报告生成器)

grep :文本过滤器
sed:流编辑器 


grep option pattern file 
sed addresscommmand file 
sed 'comand/pattern/' file 

awk(报告生成器)

根据定义好的格式,显示出来。
nawk 
gawk
gnu awk 

awk option 'script' file file2 
awk [option] 'pattern {action}' file file2 

print 
printf 自定义显示格式


awk一次抽取一行,然后对每一行进行切割分片,每一片可以使用变量进行引用。
$0:表示引用一整行
$1:第一个切片
$2:第二个切片 

awk '{print $1}' text.txt 
awk '{print $1,$2}' text.txt

选项:

-F  指定分隔符
awk -F ''

awk 'BEGIN{OPS="#"}{print $1,$2}' test.txt
BEGIN{OPS=""} 输出分隔符

输出特定字符
awk '{print $1,"hello",$2,$3,$4,$5}' file 

awk 'BEGIN{print "line one\nline two\nline tree"}'

print的格式:
print item1,item2...

awk -F: 输入分隔符 
OFS="#"   输出分隔符

awk变量

awk内置变量
FS: filed separator,读取文本时,所用字段分隔符
RS:recordsepartor,输入文本信息所使用的换行符。
OFS:OUT filed separator 
ORS:Output ROw separator 

awk -F:
OFS="#"
FS=":"

awk内置变量之数据变量

NR: the number of input record ,awk命令所处理的记录,如果有多个文件,这个数据是所有处理的行数。
FNR:当前文件所处理的行是本文件第多少行。
NF:当前所处理的行有多少个字段。


awk '{print NF}' file 
awk '{print $NF}' file 
awk '{print NR}' file 

-v 定义变量

awk -v test="hello awk" '{print test}' 
awk -v test="hell awk" 'BEGIN{print test}'


awk  'BEGIN{test='hello awk',print test}'

printf 格式化显示

printf  format,item1,item2...

awk 'BEGIN{printf %c,}'
注意:printf不换行  

%d 
%e 
%f 
%g 

修饰符
-:左对齐 
%nd:显示宽度 
awk '{printf %-10s%-10s\n,$1,$2}' file

awk的操作符
算术操作符
字符串操作符
布尔表达式

x < y 
x <= y 
x > y 
x != y 
x ~ y 匹配 
x !~ y 

表达式间的逻辑关系符

&& 
|| 

条件表达式

select?if-true-exp:if-false-exp 
a>b?a=1:b=2 

awk模式

1.正则表达式 /pattern/
2.表达式 
3.REGEXP 指定匹配范围 
4.BEGIN/END 
5Empty  


awk -F : '/^r/ {print $1}' /etc/passwd 
awk -F : '$3>=500{printf $1,$3}' /etc/passwd 
awk -F: '$3+1>=500{print $1,$3}' /etc/passwd

awk -F: '$7~"bash$"{print $1,$7}' /etc/passwd 
进行匹配测试
awk -F: '$7!~"bash$"{print $1,$7}' /etc/passwd 

awk -F: '/^r/,/^m/{print $1,$7}' /etc/passwd 

awk -F: '$3==0,$7~"bash"{print $1,$3,$7}' /etc/passwd 

awk -F '{printf "%-10s%-10s%-20s\n",$1,$2,$3}' /etc/passwd 

BEGIN ,END 

awk -F: '$3==0,$7~"nologin"BEGIN{print "Username       ID    shell"}{printf "%-10s%-10s%-20s\n"$1,$3,$7} END{print "ending"}' /etc/passwd 

action

1.ExPression 
2.control statements 
3.compound statements 
4.INput statment 
5 output statements 

控制语句

if-else

if(condition) {then-body} else {[else-body]}
eg:
awk -F:
while
while (condition){statement1;statement2;...}
循环每一字段 
length([string])

awk -F: '{i=1; while (1<=NF) if {(length($i)>4) {print $i}; i++}}'

df -hP |awk '{if($4 >=) Print $0}'


do while 
do{statement1,statement2,...} while(condition)

for 
for( ; ; ){statement1;statement2....}

awk -F: '{for(i=1:i<=NF;i++){if(length($i)>=4){print $i}}}'  /etc/passwd 

case 
switch (exprssion) {case value or /regexp/:statement1,statement2,...default:statement,....}
 
break和continue 
contine是遍历字段的 

next 
提前结束对本行文本的处理,并接着处理下一行,

数组

数组下表是从1开始的
awk[mon]=1 
awk[tus]=2 


for (var in arrary){statement,....}

awk -F: '{shell[$NF]++}END {for(A in shell) {print A,shell[A]}}' /etc/passwd 

nestat -tan 

netstat -tan |awk '/^tcp/{STATE[$NF]++}END{for (S in STATE){print S,STATE[S]}}'

awk '{count[$1]++}END{for ip in count}{printf "%-20s:%d\n",ip,count[ip]}}'  access_log 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章