三剑客

grep、sed 和 awk 命令,俗称 linux 界里的三剑客。

三剑客特点及应用场景

命令 特点 场景
grep 过滤 grep是过滤最快的
sed 替换、修改文件内容、取航 对文件内容进行替换,取出某个范围的内容(早上10到11点)
awk 取列、统计计算 取列、对比、比较、统计计算

grep 命令

 正则表达式 – 花花de代码生活 – 博客园 (cnblogs.com) 这个就充分说明了 grep 命令参数及使用。

sed命令

sed 特点及格式

  • sed stream editor 简称 sed:流编辑器,sed把处理的内容(文件),当做流水,源源不断的进行处理,直到文件尾部
  • sed 格式
命令 选项 (s)sed 命令功能替换 (g)修饰符也可以不写 参数(文件)
sed -r ‘s#olkdboy#oldgir#g’ oldboyd.txt

 

  • sed 命令核心功能(增删改查)
s 替换 substitute sud
p

显示 print

d 删除 delete
cai 增加 c/a/i

 

sed 执行格式

  • “找谁干啥”
  • 找谁:”你要哪一行”
  • 干啥:”增删改查

sed 核心应用

sed 查找 p

1 '2p'                   指定查找行号进行查找          ==>   sed -n '2p' sed_text.txt           //只查找第 2 行数据
2 '1,5p'                 指定范围进行查找             ==>   sed -n '1,5p' sed_text.txt          //查找 1 到 5 行
3 '$p'                   显示最后一行                ==>   sed -n '4,$p' sed_text.txt         //查找第四行到最后一行
4 '/lidao/p'             类似于 grep 过滤查找,//里可以写正则        ==>  sed -n '/11:26:30/,/11:30:00/p' sed_text.txt    //查找log 11:26到11:30

 sed 删除 d

1 '2d'               指定删除第2行数据
2 '1,5d'            范围删除第1行到第5行数据
3 '$d'               删除最后一行
4 '/lidao/d'       查找删除 lidao 这个单词

案例

删除文件中的空行包含井号的行

grep -v '^$|#' /etc/ssh/sshd_config
sed -r '/^$|#/d' /etc/ssh/sshd_config

# ! 的妙用
sed -nr '/^$|#/!p' /etc/ssh/sshd_config        //不显示空格和井号

sed 增加 cai

命令 含义
c replace 代替这行内容
a append 追加,向指定的行或每一行追加内容(行后面)
i insert 插入,向指定的行或每行插入内容(行前面)

案例:向文件中追加多行内容

 1 例子:向 config 里追加
 2 UseDNS no
 3 GSSAPIAUTCATION no
 4 PeritRootLogin no
 5 
 6 方法一:
 7 cat >>config<< 'EOF'            #单引号是里面有特殊符号时加的
 8 UseDNS no
 9 GSSAPIAUTCATION no
10 PeritRootLogin no
11 EOF
12 
13 方法二:
14 sed '$a UseDNS no\GSSAPIAUTCATION no\PeritRootLogin no' config    

sed 替换 s

  • s  ==>  sub subsitute 替换
  • 替换格式:s###g、s@@@g、s///g 都可以
  • g  ==>  global  全局替换,sed替换每行所以匹配的内容,sed 默认只替换每一行第一个匹配的内容

 案例:永久关闭 selinux

1 sed -i '/SELINUX/{s/enorcing/disabled/}' /etc/selinux/config

后向引用,反引用

口诀:先保护后使用

举例:

[root@shell ~]# echo 123456
123456

#第一个()从开头到2、中间()是全部、第三个()5开头到最后。\2是取第二个获取到的数据
[root@shell ~]# echo 123456 |sed -r 's#(^.*2)(.*)(5.*$)#<\2>#g'
<34>

#获取ip地址
[root@shell ~]# ip a s ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:89:d1:fc brd ff:ff:ff:ff:ff:ff
inet 192.168.100.250/24 brd 192.168.100.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::4629:e885:ac9c:7d76/64 scope link noprefixroute
valid_lft forever preferred_lft forever
# 方法一 [root@shell
~]# ip a s ens33 |sed -n '3p'|sed -r 's#(^.*t )(.*)(/.*$)#\2#g' 192.168.100.250 # 方法二
[root@shell
~]# ip a s ens33 |sed -rn '3s#(^.* )(.*)(/.*$)#\2#gp' 192.168.100.250

awk 命令

awk 应用场景

awk 是一门语言,类似于 c 语言,主要是过滤、统计、计算和统计日志。

行于列

名词 awk中的叫法 说明
记录 record 每一行默认通过回车分割的
字段、域 field 每一列默认通过空格分割的
awk 中行和列结束标记都是可以修改的

取行

模式 说明
NR==1 取出某一行
NR>=1 && NR>=5 取出1到5行
/oldboy/ 取出有 oldboy 的行
/101/,/105/ 取出 101-105 行
符号 > < >= <= == !=

例:

 1 [root@shell ttt]# cat awk_t.txt 
 2 1. asjia
 3 2. dafaf
 4 3. fmopia
 5 4. root
 6 5. dfwfg
 7 6. sfghhb
 8 [root@shell ttt]# awk '/2/,/5/' awk_t.txt 
 9 2. dafaf
10 3. fmopia
11 4. root
12 5. dfwfg
13 [root@shell ttt]# awk 'NR==2' awk_t.txt     
14 2. dafaf

取列

选项 说明
-F 指定分隔符,指定每一列结束标记(默认是空格,连续的空格,tab键)
$数字 取出某一列,注意:在 awk 中 $ 内容一个意思,表示取出某一列
$0 整行的内容
{ptint xxx} 取列的时候使用的选项
$NF 表示最后一列

 

例:

 1 [root@shell ~]# ls -l
 2 总用量 4
 3 -rw-------. 1 root root 1311 3月  18 15:35 anaconda-ks.cfg
 4 drwxr-xr-x  2 root root   55 3月  20 16:40 CTF
 5 drwxr-xr-x  2 root root  247 4月   3 12:36 ttt
 6 # 显示第5列
 7 [root@shell ~]# ls -l |awk '{print $5}'
 8 
 9 1311
10 55
11 247
12 # 显示第5列和第9列 (column -t 是对齐)
13 [root@shell ~]# ls -l |awk '{print $5,$9}' |column -t
14 1311  anaconda-ks.cfg
15 55    CTF
16 247   ttt
17 # 调换位置显示
18 [root@shell ~]# ls -l |awk '{print $9,$5}' |column -t    
19 anaconda-ks.cfg  1311
20 CTF              55
21 ttt              247
22 
23 # 获取ip地址 -F:以什么为分隔符 、+:空格可能有连续的所以使用+
24 [root@shell ~]# ip a s ens33 |awk -F"[ /]+" 'NR==3{print $3}'
25 192.168.100.250

 awk 正则

  • //        支持正则
  • awk可以精确到某行,某列中包括/不包括…..内容
  • ~ 包含
  • !~ 不包含

例:

 1 # -F表示以:为分隔符、$3:第三列以1开头的行
 2 [root@shell ~]# awk -F: '$3~/^1/' /etc/passwd
 3 bin:x:1:1:bin:/bin:/sbin/nologin
 4 operator:x:11:0:operator:/root:/sbin/nologin
 5 games:x:12:100:games:/usr/games:/sbin/nologin
 6 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
 7 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
 8 mysql:x:1000:1000::/home/mysql:/sbin/nologin
 9 
10 # 找出第三列以1或2开头的行,并显示第一行、第二行和最后一行
11 [root@shell ~]# awk -F: '$3~/^[1|2]/{print $1,$3,$NF}' /etc/passwd 
12 bin 1 /sbin/nologin
13 operator 11 /sbin/nologin
14 games 12 /sbin/nologin
15 ftp 14 /sbin/nologin
16 systemd-network 192 /sbin/nologin
17 mysql 1000 /sbin/nologin

 

 

awk 正则范围

  • /哪里开始/,/哪里结束/ 
  • NR==1,NR==5   从第一行开始第五行结束
1 # 找出11.20到11.30 的第一行日志
2 awk '/11:20:00/,/11:30:00/{print $1}' mysql.log

 

 

特殊模式 BEGIN{} 和 END{}

 

模式 含义 应用场景
BEGIN{} 里面的内容会在 awk 读取文件之前执行
  • 进行统计、计算、不涉及读取文件(常见)
  • 用来处理文件之前,添加个表头
  • 用定义 awk 变量(很少用,因为可以使用 -v)
END{} 里面的内容会在 awk 读取文件之后执行
  • awk 进行统计,一般过程:先进行计算,最后 END 里面输出结果(常见)
  • awk 使用数组,用来输出数组结果(常见)

BEGIN{}

awk 数组

awk 字母会识别为变量,如果只是想使用字符串需要使用双引号引起来

[root@shell ~]# awk 'BEGIN{a[0]=123456;a[1]="huahua";print a[0] a[1]}'
123456huahua

#不加 a[i] 就只显示数组下标很数组号
[root@shell ~]# awk 'BEGIN{a[0]=123456;a[1]="huahua";a[2]="afjika";for(i in a) print i,a[i]}'
0 123456
1 huahua
2 afjika

END{}

统计方法:

  • i=i+1:简称 i++ 应用场景统计,计数
  • sum=sum+???: 简称 sum+=??? 应用场景求和,累加
  • array[]=artray[]+:数组统计
[root@shell ~]# awk '/^$/' /etc//services |wc -l
17
[root@shell ~]# awk '/^$/{i++}END{print i}' /etc//services 
17

例:1 加到 100

1 [root@shell ~]# seq 100 |awk '{sum=sum+$1}END{print sum}'
2 5050

数组统计(统计次数)

 1 [root@shell ~]# cat url.txt 
 2 http: // www. etiantian. org/index.html
 3 http: // www. etiantian. org/1.html
 4 http: //post.etiantian. org/index.html
 5 http: //mp3.etiantian. org/index.html
 6 http: // www. etiantian.org/3.html
 7 # sort -rnk2 是倒叙排列
 8 [root@shell ~]# awk -F"[/.]+" '{array[$2]++}END{for(i in array)print i,array[i]}' url.txt |sort -rnk2
 9 www 3
10 post 1
11 mp3 1
版权声明:本文为花花de代码生活原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/huahuadebk/p/16090480.html