linux 三剑客
三剑客
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 读取文件之前执行 |
|
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