grep awk sed 三剑客

awk 三剑客老大 过滤字符串 统计数据
grep 三剑客老三 过滤字符串
sed 三剑客老二 查找替换字符串

1.grep: 过滤文件中的内容

  -v  取反
  -E  支持扩展正则 | 或者egrep    '^$|#'
  -n  显示过滤到内容的行号
  -o  查看匹配过滤过程

单引号和双引号的区别 不加引号
单引号不能解析变量
双引号和不加引号可以解析变量过滤文件中的内容 

grep '过滤的内容' 文件     # 直接跟文件过滤		
cat 文件|grep '过滤的内容' # 过滤其他命令的输出结果	  
[root@oldboyedu ~]# cat passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@oldboyedu ~]# cat passwd|grep root
root:x:0:0:root:/root:/bin/bash

1.1 正则 ^ 以什么什么开头的行

  . 表示任意单个字符
[root@oldboyedu ~]# grep ^r passwd
root:x:0:0:root:/root:/bin/bash

$ 以什么什么结尾的行

[root@oldboyedu ~]# grep nologin$ passwd 
bin:x:1:1:bin:/bin:/sbin/nologin

[root@oldboyedu ~]# grep '^$' /etc/selinux/config

1.2 -v 对查找到的内容进行取反

[root@oldboyedu ~]# grep -v '^$' /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted 
---------------------------
[root@oldboyedu ~]# grep root passwd 
root:x:0:0:root:/root:/bin/bash
[root@oldboyedu ~]# grep -v root passwd 
bin:x:1:1:bin:/bin:/sbin/nologin
	 
----------------------------

1.3 扩展正则:

[root@oldboyedu ~]# grep -v '^$' /etc/selinux/config|grep -v '#'
SELINUX=disabled
SELINUXTYPE=targeted 
[root@oldboyedu ~]# grep -v '^$' /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted 
[root@oldboyedu ~]# grep -v '^$' /etc/selinux/config|grep -v '#'
SELINUX=disabled
SELINUXTYPE=targeted 

		 
[root@oldboyedu ~]# egrep -v  '^$|#' /etc/selinux/config 
SELINUX=disabled
SELINUXTYPE=targeted 

2. awk 三剑客老大 过滤字符串 统计数据

  语法格式:
        awk '/查找的内容/' file
        cat file|awk '/查找的内容/'

awk '模式{动作}' file
只要模式没有动作 默认输出模式匹配到的内容

2.1 awk过滤字符串

[root@oldboyedu ~]# cat passwd |awk '/root/'
root:x:0:0:root:/root:/bin/bash
[root@oldboyedu ~]# cat passwd |awk '/^ro/'
root:x:0:0:root:/root:/bin/bash
可以按行和列进行过滤文件内容
先过滤出文件的第二列
表达式:
      == 等于
      != 不等于
      >
      <
      >=
      <=
			  
[root@oldboyedu ~]# awk 'NR==2' passwd 
bin:x:1:1:bin:/bin:/sbin/nologin
		

[root@oldboyedu ~]# awk 'NR<2' passwd 
root:x:0:0:root:/root:/bin/bash
[root@oldboyedu ~]# awk 'NR<5' passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@oldboyedu ~]# awk 'NR>5' passwd 
[root@oldboyedu ~]# awk 'NR>=5' passwd 
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@oldboyedu ~]# awk 'NR<=5' passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

2.2 并且&&

[root@oldboyedu ~]# # 查找行大于2并且小于5的
[root@oldboyedu ~]# awk 'NR>2&&NR<5' passwd 
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

2.3 或者||

[root@oldboyedu ~]# awk 'NR==2||NR>4' passwd 
bin:x:1:1:bin:/bin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  按行匹配使用过滤字符串方式 过滤时间
[root@oldboyedu ~]# awk '/root/,/daemon/' passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

2.4 按列

0 1 2 3 4 5 awk的内容变量
0 表示所有的行
awk执行方式按一行一行的执行
		
awk '匹配模式{动作}' file
awk '女朋友{干啥}' file   # 如果前面没有匹配动作 则对整个文件进行操作
		
awk '{print }' file
[root@oldboyedu ~]# awk '{print $0}' passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@oldboyedu ~]# awk 'NR==1{print $0}' passwd # 找到谁干啥 加上了动作 默认动作就是print输出
root:x:0:0:root:/root:/bin/bash

2.5 awk按列查找内容 默

  认以空格和tab键分割
  1 就是第一列
  2 就是第二列
  获取变量 $1 $2

2.5.1 使用-F 指定分隔符

[root@oldboyedu ~]# awk -F: '{print $1}' passwd 
root
bin
daemon
adm
lp

[root@oldboyedu ~]# awk -F: '/root/' passwd 
root:x:0:0:root:/root:/bin/bash
[root@oldboyedu ~]# awk -F: '/root/{print $1}' passwd 
root

2.5.2 wc 统计数量

  -l 统计行号 
  -L 统计文件中最长的行的长度
[root@oldboyedu ~]# awk -F: ' $3>0 && $3<1000' /etc/passwd|wc -l
22
[root@oldboyedu ~]# awk -F: '$3==0' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@oldboyedu ~]# awk -F: '$3==0' /etc/passwd|wc -l
1
[root@oldboyedu ~]# awk -F: '$3>=1000' /etc/passwd|wc -l
3

2.5.3 sort 排序 默认按照首列字母或数字进行升序排序

  -r  逆序排序
[root@oldboyedu ~]# seq 10|sort 
1
10
2
3
4
5
6
7
8
9

[root@oldboyedu ~]# seq 10|sort -n
1
2
3
4
5
6
7
8
9
10
[root@oldboyedu ~]# seq 10|sort -rn
10
9
8
7
6
5
4
3
2
1

2.5.4 uniq -c 统计字符串出现的次数

[root@oldboyedu ~]# cat test.txt|sort 
alex
alex
lidao
lidao
oldboy
oldboy
oldboy
test
[root@oldboyedu ~]# cat test.txt|sort |unqi -c
-bash: unqi: command not found
[root@oldboyedu ~]# cat test.txt|sort |uniq -c
2 alex
2 lidao
3 oldboy
1 test
[root@oldboyedu ~]# cat test.txt|sort |uniq -c|sort -rn
3 oldboy
2 lidao
2 alex
1 test
[root@oldboyedu ~]# cat test.txt|sort -rnk2
oldboy 3
lidao 2
alex 2
test 1

[root@oldboyedu ~]# awk -F: '{print $NF}' /etc/passwd|sort |uniq -c|sort -rn
19 /sbin/nologin
4 /bin/bash
1 /sbin/shutdown
1 /sbin/halt
1 /bin/sync

[root@oldboyedu ~]# awk -F: '{shells[$NF]++}END{for(i in shells)print i,shells[i]}' /etc/passwd
/bin/sync 1
/bin/bash 4
/sbin/nologin 19
/sbin/halt 1
/sbin/shutdown 1

3. sed 取行 过滤字符串 替换

  格式:
  sed '/过滤字符串/' file
  cat file|sed '/过滤字符串/'
  -n  取消默认输出
  -i  修改源文件

  sed执行过程
  一行一行的处理
  如果对当前的行 没有动作 默认输出到屏幕
  sed 增 删 改 查

3.1 sed 之 查内容

按照字符串匹配

[root@oldboyedu ~]# sed -n '/root/p' passwd 
root:x:0:0:root:/root:/bin/bash

[root@oldboyedu ~]# sed -n '/^root/p' passwd 
root:x:0:0:root:/root:/bin/bash
[root@oldboyedu ~]# sed -n '/^ro/p' passwd 
root:x:0:0:root:/root:/bin/bash
[root@oldboyedu ~]# sed -n '/sh$/p' passwd 
root:x:0:0:root:/root:/bin/bash

[root@oldboyedu ~]# sed -n '/root/,/adm/p' passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

[root@oldboyedu ~]# sed -n '3p' passwd 
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@oldboyedu ~]# sed -n '2p' passwd 
bin:x:1:1:bin:/bin:/sbin/nologin
[root@oldboyedu ~]# sed -n '1p' passwd 
root:x:0:0:root:/root:/bin/bash


[root@oldboyedu ~]# sed -n '1,3p' passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin


[root@oldboyedu ~]# sed -n '$p' passwd 		# 最后一列
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

3.2 sed之增加内容

a 在n行后面追加新的内容

[root@oldboyedu ~]# cat test.txt
lidao 2
alex 2
oldboy 3
test 1
[root@oldboyedu ~]# sed '2a oldboy111' test.txt
lidao 2
alex 2
oldboy111
oldboy 3
test 1

3.3 i 在当前行插入新的内容

[root@oldboyedu ~]# sed '2i oldboy111' test.txt
lidao 2
oldboy111
alex 2
oldboy 3
test 1

3.4c 替换当前整行的内容

[root@oldboyedu ~]# sed '2c oldboy111' test.txt
lidao 2
oldboy111
oldboy 3
test 1

			
[root@oldboyedu ~]# sed -i '7c SELINUX=disabled' /etc/selinux/config

3.5 w 保存当前的内容至文件 没啥用

[root@oldboyedu ~]# sed '1,3w newfile.txt' test.txt
lidao 2
alex 2
oldboy 3
test 1

3.6 sed之删除

  格式:
  sed  '3d' file
[root@oldboyedu ~]# sed  '3d' test.txt
lidao 2
alex 2
test 1
[root@oldboyedu ~]# sed  '1,3d' test.txt
test 1

[root@oldboyedu ~]# sed  '/root/d' passwd 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

3.7 sed替换

  sed 's#替换谁#替换成什么#g'
  sed 's///g'
  sed 's@@@g'
  s   替换标志
  g 全局替换
[root@oldboyedu ~]# sed 's#root#oldboy#g' passwd 
oldboy:x:0:0:oldboy:/oldboy:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
oldboy:x:oldboy:var/var:sbin/login

[root@oldboyedu ~]# sed 's#200#201#g' /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=10.0.0.201
PREFIX=24
GATEWAY=10.0.0.254

[root@oldboyedu ~]# sed 's#[:/0-9x]# #g' /etc/passwd|xargs -n1|sort |uniq -c|sort -rn|head
25 sbin
19 nologin
8 bin
7 var
4 root
4 oldboy
4 bash
3 sync
3 spool
3 shutdown

[root@oldboyedu ~]# sed 's#[:/0-9]# #g' /etc/passwd|xargs -n1|awk '{count[$1]++}END{for(i in count) print i,count[i]}'|awk '{print $2,$1}'|sort -rn|head|grep -v x
25 sbin
19 nologin
8 bin
7 var
4 root
4 oldboy
4 bash
3 sync
3 spool
原文地址:https://www.cnblogs.com/hsqKTm/p/13953845.html