Linux三剑客

一. grep讲解

1. grep工作原理

1. grep是一个全局朝朝正则表达式并且打印结果行的命令。输入是一个文件或者一个标准输入stdin,输出一般显示在屏幕上,其中egrep是在使用扩展正则上使用

2. grep命令查找一个或多个文件内容,不会对输入文件进行任何修改或变化

3. 命令格式:grep  [选项] 模式  [文件]

例如:grep 'root' /etc/passwd

其中grep将在/etc/passwd种查找模式root,若查找成功,会打印相应结果显示在屏幕上,返回值为0;若没有则不会有任何输出,返回值为1;找不到指定文件的时候,返回值为2

4. grep程序输入可来自标准输入或者管道,不仅仅是文件,若是未指定文件,则会从标准输入键盘中读取输入,从而处理模式;若输入来自管道,则前一条命令的标准输出作为grep命令的输入,若匹配到查找的模式,会将输出打印到屏幕上!(若不加任何参数,则会打印匹配模式的所在行,其中匹配的内容标为红色)

正则补充:
& :保存查找串以便在替换串中引用
#s/love/**&**/ :&代表查找串,字符串love将替换前后个加了两个**的引用,即love变为**love**

grep选项参数:
1. grep -E:扩展正则表达式 == egrep
2. grep -i:忽略大小写
3. grep -x: 被匹配到的内容,正好是整个行,相当于正则"^...$"
4. grep -v: 输出匹配模式相反的内容
5. grep -c:统计匹配结果的行数!
6. grep -m: 只匹配规定的行数,之后的内容不在匹配
7. grep -n:在属虎的结果中显示行号,是显示改行在原文件中的行号,而不是输出结果的行号
8. grep -o:只输出匹配的内容,grep默认是显示满足匹配模式的一行,加上该参数而不需要该行的内容
9. grep -R:递归匹配,可在一个目录中查找多个文件或目录匹配模式
10.grep -B:输出满足条件行的前几行,包括匹配的行内容以及前两行的内容
[root@tttyyy-ty test]# grep -B 2 'oldgirl' /etc/passwd
ttyty:x:1000:1000:Ttyty:/home/ttyty:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
oldgirl:x:1001:1001::/home/oldgirl:/bin/bash
11.grep -A:输出满足条件的后几行
12. grep -C:输出满足条件的前几行和后几行,前后都输出
1. grep '[a-z]\{9\}' a.txt ##打印连续出现9个小写字母连在一起的行
###或者写成:grep -E '[a-z]{9}' a.txt
a|b :扩展正则,匹配a或b,或的关系!
[root@tttyyy-ty test]# egrep 'oldgirl|root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
oldgirl:x:1001:1001::/home/oldgirl:/bin/bash
2. grep -n :找到指定模式的行前面加上行号在输出
[root@tttyyy-ty test]# grep -En 'old.*?' /etc/passwd
23:oldgirl:x:1001:1001::/home/oldgirl:/bin/bash
27:old1:x:1005:1005::/home/old1:/bin/bash
28:old2:x:1006:1006::/home/old2:/bin/bash
29:old3:x:1007:1007::/home/old3:/bin/bash
30:old4:x:1008:1008::/home/old4:/bin/bash
31:old5:x:1009:1009::/home/old5:/bin/bash
32:old6:x:1010:1010::/home/old6:/bin/bash
3. grep -l :只会输出包含模式的文件名,而不输出文本行(多用于俩文件以上)
[root@tttyyy-ty test]# grep -l 'old' /etc/passwd /etc/profile
/etc/passwd
/etc/profile
4. grep -c:打印出含有模式的行的数目,并不代表模式的出现次数,若是一行中有多个匹配,也记为一行
[root@tttyyy-ty test]# grep -c 'old' /etc/passwd
11

二. sed讲解

1.sed是新型的非交互式的编辑器,能执行与编辑器vi,vim相同的编辑任务,一次处理一行内容,又叫流文本编辑器,在模式中双引号单引号都是可以的,是对整行进行操作,并不会真正的修改文件,除非指定参数i将改动后的文件覆盖原来的文件才算真正修改

2.sed工作原理:

sed编辑器逐行处理文件,并将输出结果发送到屏幕,把当前正在处理的行保存到一个临时缓存区中(模式空间或者临时缓冲),sed处理完模式空间的行后就把该行发送到屏幕上(除非之前按有命令删除这一行或者取消打印操作),sed处理完输入文件的最后一行后就结束运行,所以sed是对临时缓存区中的副本进行编辑,不会真正修改或破坏源文件

3.sed命令格式:

sed命令格式: sed  选项(参数)    '模式'   输入文本

参数:-f (指定一个sed脚本规则文件)    -e:多重编辑,且命令顺序会影响结果

 -n(阻止默认输入行输出,一般情况下stdin都会被输出到屏幕上,加入n后只打印被sed特殊处理的行

-r(使用扩展正则) -i(直接修改文档读取的内容,不在屏幕上输出)

模式:s(替换) d(删除) p(打印)

c\:(替换修改一整行)

i\:匹配的行前面一行插入

a\:匹配的行后面一行追加一行或者多行

h:   将模式空间里的内容复制到暂存缓存区

H:把模式空间里的内容追加到暂存缓存区

g :取出暂存缓冲区里的内容,将其复制到模式空间,覆盖该处原有内容

G:取出暂存缓冲区里的内容,将其复制到模式空间,追加在原有内容后面

I:列出非打印字符

n:读入下一输入行,并从下一条命令而不是第一条命令开始处理

q:结束或退出 sed

r:从文件中读取输入行

! : 取反

####################

替换标志

g(整行内的全局替换,可也是数字,替换第几个)

sed模式表现形式:

 1. 2~5:从第二行开始,每隔五行进行匹配

2. $ : 匹配最后一行

3. /匹配正则/ :匹配正则的内容

4. \c匹配正则c : 表示匹配正则那一行,通过\c和c之间的正则来匹配,c可以是任一字符

5. 定址:若是一个数字,则是代表第几行,若是逗号分隔的两个行号,则是两行之间的范围;若是分号分割的两个行号,则是表示第几行和第几行

1.匹配以love开头的行 : /^love/
2.匹配以love结尾的行:/love$/
3.匹配有l**e的行:/l..e/
4.匹配在0个或多个空格紧跟模式love的行:/*love/
5.匹配包含love和Love的行:/[lL]ove/ 

============================================================
1.打印P
[root@tttyyy-ty ~]# sed '/old/p' passwd 
old:x:1001:1001::/home/oldgirl:/bin/bash
old:x:1001:1001::/home/oldgirl:/bin/bash
ntp:x:38:38::/etc/ntp:/sbin/nologin
ty:x:1002:1002::/home/ty:/bin/bash
jumpserver:x:1004:1004::/home/jumpserver:/home/jumpserver/jumpserver.sh
old1:x:1005:1005::/home/old1:/bin/bash
old1:x:1005:1005::/home/old1:/bin/bash
old2:x:1006:1006::/home/old2:/bin/bash
old2:x:1006:1006::/home/old2:/bin/bash
old3:x:1007:1007::/home/old3:/bin/bash
old3:x:1007:1007::/home/old3:/bin/bash
##因为sed默认会把输入行打印到屏幕上,-n:取消默认打印,若某一行匹配到old,则把该行另外打印一遍

sed -n '/old1/,/old3/p' passwd 
#匹配出现old1到old3的行,如果old1出现在old3之后的某一行,则打印范围从old1行开始,到下一个出现old3的行或者文件的末尾(若old3未出现!!!)

sed -n '5,/old1/p' passwd 
#打印从第五行到第一个匹配到old1的所有行

2.删除d
sed '3d' passwd: 删除第三行
##d命令删除输入行,sed先将输入行从文件复制到模式缓存区,然后对该行执行sed命令,最后将模式缓存区的内容显示在屏幕上,若为d,则当前输入行会被删除,不会被显示

sed '3,$d' passwd:删除第三行到最后一行的内容

3.替换s(替换和取代文件中的文本,其中s后面是正则表达式,后面跟着替换的文本)
sed 's/old/new/g' passwd :将文件中所有old变成new
##g代表若每一行内出现多个old,则都会被全部替换成new,若不加g,则替换每一行出现的第一个old

sed -n 's/^old/new/p' passwd #(打印以old开头的行变为new的行)
##-n与p结合使用,sed只打印发生替换的那些行

sed 's/[0-9][0-9]$/&.5/' passwd 
##当&用在替换串中,戴白哦在查找串中匹配到的内容,所有以2位数结尾的行后面都被加上.5

sed -r's/(bin).*/hello\1/gp' passwd
##()代表后项引用前项,其中\1代表前面正则中括号的内容

sed '/old/,/old1/s/$/**end**/' passwd
##修改从模式old到old1的所有行,将各行的行尾替换为字符串(**end**),换行符被移到新的字符串的后面

###紧跟在s后面的分隔符可以改变,无论什么字符,都要紧跟在s命令的后面,成为分隔符

4.多重编辑:e
e用于执行多个编辑任务的情况下,在下一行开始编辑前,所有的编辑动作将应用到模式缓存区的行上
例:
sed -e '1,3d' -e 's/old1/tom/' passwd
##第一重编辑删除1-3行,第二重编辑将old1换为tom,因为逐行进行这两行编辑(这两个命令都在模式空间的当前行上执行),所以编辑命令的顺序会影响结果,若两条命令都执行的是替换,前一次替换会影响后一次替换

5.追加a
a:追加在匹配行的后面,其中a总是在/(反斜杠)的后面
sed '/^old1/a hello,world!' passwd
##字符串hello world!追加在以old1开头的行的后面,若追加的内容超过一行,则除最后一行外,其他各行都必须以/结尾

6.插入i
i:在当前行前面插入新的文本
sed '/^old1/i hello' passwd 
##在匹配的old1的行的前面插入字符串

7.修改c
c:修改命令,使用该命令将已有的文本修改成新文本,针对匹配到的内容的一行进行修改
sed '/^old1/c hello' passwd
##是替换匹配到old1的一整行内容

8. 获取下一行:n
n:代表下一条命令,sed使用该命令可获取输入文件的下一行,并将其读入到模式缓存区中,任何sed命令都将应用到匹配行,紧接着的下一行上
sed 'eas/{n;s/am/pm/;}' passwd
##如果在某一行匹配到模式 eas,n 命令就指示 sed 用下一个输入行(即包含am的那行)替换模式空间中的当前行,并用 pm 替换 am,然后打印该行,再继续往下处理。

9. 转换:y
y 命令表示转换。该命令与 tr 命令相似,字符按照一对一的方式从左到右进行转换。例
如 y/abc/ABC/,会把小写字母转换成大写字母,a-->A,b-->B,c-->C。
sed '3y/abcdef/ABCDEF' passwd
##将第三行所有的小写字母转为大写字母,正则表达式元字符对y不起作用

10. 退出:q
q:表示退出,导致sed程序退出,不再进行其他处理
sed '5q' passwd 
##打印完第五行之后,q就让sed程序退出,屏幕上只打印了前五行的内容

sed '/old1/{s/old1/Hello/;q;}' passwd
##在某行匹配到模式old1时,s表示先将old1替换成Hello,然后q命令让sed程序退出


删除文本中空行和空格组成的行及#号注释的行
sed -ri '/^$|^#/d' passwd 

grep -viE '^#|^$' passwd


##其中sed参数i和n不能同时使用,i是将内存中的文件覆盖原文件,n是取消默认输出,这样会造成文件内容丢失!!!千万不可
可以使用:
sed -i.bak '/^$/d' passwd (其中在覆盖之前将源文件备份一份)

三. awk讲解

1. awk原理

1. awk是和用于文本处理和报表生成,借鉴了某些语言的一些精华,例如C语言

2. awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息
awk处理过程: 依次对每一行进行处理,然后输出 默认分隔符是空格或者tab键

原理:awk -F":" '{print $1,$3}' /etc/passwd 
(1)awk使用一行作为输入,并将这一行赋给变量$0,每一行可称作为一个记录,以换行符结束
(2)然后,行被:分解成字段,每个字段存储在已编号的变量中,从$1开始 
(3)awk如何知道空格来分隔字段的呢?因为有一个内部变量FS来确定字段分隔符,初始时,FS赋为空格或者是tab 
(4)awk打印字段时,将以设置的方法,使用print函数打印,awk在打印的字段间加上空格,因为$1,$3间有一个,逗号。逗号比较特殊,映射为另一个变量,成为输出字段分隔符OFS,OFS默认为空格 
(5)awk打印字段时,将从文件中获取每一行,并将其存储在$0中,覆盖原来的内容,然后将新的字符串分隔成字段并进行处理。该过程持续到处理文件结束。


 awk 'BEGIN{FS=".";OFS="@"}{print $1,$2}' awk.txt  !!!只有当有,OFS才会起作用
 awk 'BEGIN{FS=".";OFS="@"}{print}' awk.txt 
 awk -F ":" 'BEGIN{printf "%-15s %-15s\n","user","home"}{print $1,$6}'

FS: 输入字段分隔符  -F:默认是空格或者tab键

OFS:输出字段分隔符   默认是空格

RS:输入记录分隔符  默认是换行符

ORS:输出记录分隔符

NF:指的是当前处理行的字段数量

2. awk语法

1. awk 参数 'BEGIN{处理之前要做的} {处理内容} END{处理之后的内容}'

BEGIN{} 处理之前执行,一般定义分隔符,打印开头等 ---行处理前   
{}       处理文件执行,文件有多少行,处理多少次,模式  ---行处理
END{}  行处理后  --处理文件之后执行,一般统计结果使用

2. awk支持运算
awk 'BEGIN{a=5;a+=5;print a}'   ##若是打印字符串print后面必须加双引号,否则就为变量
10 

awk 'BEGIN{a=1;b=2;print(a>2&&b>1,a=1||b>1)}'    
0 1 

awk 'BEGIN{a='100testaaa';if(a~/100/){print “ok”}}'    ##支持正则运算符

3.awk指定以一个或多个空格或:分割
awk -F ["":]+ '{print $1,$2}' hello.txt

4. awk中RS记录分隔符
将 FS 设置成"\n"告诉 awk 每个字段都占据一行。通过将 RS 设置成"",还会告诉 awk
每个地址记录都由空白行分隔。
awk 'BGEIN{FS="\n";RS=""}{print $1}' hello.txt

5. awk中ORS输出记录分隔符
awk 'BEGIN{FS="\n";RS="";ORS="\n]n"}{print $1}' hello.txt



1. 取出IP地址
ip eth0 | awk 'NR==2{print $2}'

2. 布尔表达式
awk '布尔表达式{action}' file 仅当对前面的布尔表达式求值为真时,awk 才执行代码块
awk -F ':' '$1=="root"{print $0}' hello.txt

awk -F: '($1=="root")&&($5=="root"){print $0}' hello.txt

3. awk的if,循环和数组

3.1 条件语句
{
 if ( $1== "foo" ) {
 if ( $2== "foo" ) {
 print "uno"
 } else {
 print "one"
 }
 } elseif ($1== "bar" ) {
 print "two"
 } else {
 print "three"
 }
}
3.2 循环
for ( x=1;x<=4;x++ ) {
 print "iteration", x
}
3.3 数组
查看服务器连接状态并汇总
netstat -an|awk '/^tcp/{++s[$NF]}END{for(a in s)print a,s[a]}' 

查看shell的种类并汇总
awk 'BEGIN{FS=":"}{shell[$NF]++}END{for (i in shell)print i":"shell[i]}'  /etc/passwd

统计web日志访问流量,要求输出访问次数,请求页面或图片,每个请求的总大小,总访问流量的大小汇总
awk '{a[$7]+=$10;++b[$7];total+=$10}END{for(x in a)print b[x],x,a[x]|"sort -rn -k1";print
"total size is :"total}' /app/log/access_log
total size is :172230
21 /icons/poweredby.png 83076
14 / 70546
8 /icons/apache_pb.gif 18608
a[$7]+=$10 表示以第 7 列为下标的数组($10 列为$7 列的大小),把他们大小累加得到
$7 每次访问的大小,后面的 for 循环有个取巧的地方,a 和 b 数组的下标相同,所以一
条 for 语句足矣
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值