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