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 读取文件之前执行
  • 进行统计、计算、不涉及读取文件(常见)
  • 用来处理文件之前,添加个表头
  • 用定义 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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM