一、三剑客-sed指令
1、格局
sed + '找谁干啥' + 文件
找谁:条件,匹配哪一行,哪些行.
干啥:动作,增删改查.
#显示文件的第3行
sed -n '3p' /etc/passwd
选项 | 阐明 |
---|---|
-n | 撤销默认输出 |
-p | 查找 |
-r | sed支撑扩展正则 |
-i | 修正文件内容,这个选项放在最终 |
-i.bak | 先进行备份,然后修正文件内容,这个选项放在最终 |
2、如何运行
3、sed之查找
一种是类似于grep含糊查找. 一种是精确查找,行号.
- 类似于grep指令的过滤,比grep强在于能够指定行号,
- 类似于grep指令的功能,含糊查询(经过正则).
事例01:取出文件的第3行
-n表明撤销默认输出,sed处理文件的时分会默认的输出每一行内容
sed -n '3p' /etc/passwd
事例02:取出/etc/passwd的第2行到第5行
sed -n '2,5p' /etc/passwd
事例03:过滤出/etc/passwd中包括root的行
sed -n '/root/p' /etc/passwd
cat /etc/passwd | grep root
#假如是以root最初呢
sed -n '/^root/p' /etc/passwd
sed进行过滤的时分需求运用
//
而且里面支撑根底正则 假如需求运用扩展正则需求运用sed -r
选项
事例04:获取范围内的日志
#sed -n '/从哪里来/,/到哪里去/p' tx.txt
sed -n '/102/,/104/p' tx.txt
事例05:只显示第3行和第5行
sed -n '3p;5p' /etc/passwd
事例06:表明有规律查找
[root@nanjing ~]# seq 10 | sed -n '1~2p'
1
3
5
7
9
[root@nanjing ~]# seq 10 | sed -n '2~2p'
2
4
6
8
10
4、sed之修正
sed指令替换格局
sed 's#找谁#替换成什么#g'
tx.txt引荐运用:###,@@@,///
s substitute 替换 sub
g global 全局替换,这一行中把一切匹配到的内容都进行替换,不然只替换每一行第1个匹配的内容
修正文件内容
-i
确认修正
修正文件内容之前进行备份,然后修正文件内容
sed -i.bak 's#js#xp#g' tx.txt
一般用于替换某一个文件,假如是多个文件就打包紧缩进行备份即可
后向引用格局
sed指令中用于处理列的方法:
运用替换的方式 s###g
前2个井号之间经过正则与(),对数据进行分组
后边2个井号之间经过数字
,去调用前面分组的内容
#输出12345678,经过sed加工变成1<234567>8
[root@nanjing ~]# echo {1..8} | sed -r 's#(1)(.*)(8)#1<2>3#g'
1< 2 3 4 5 6 7 >8
事例01:互换/etc/passwd第1列和最终一列内容
sed -r 's#(^.*)(:x.*:)(.*$)#321#g' passwd
事例02:取出网卡ip地址
ip a s eth0 | sed -n '3p' | sed -r 's#^.*et ([0-9.]+)/.*$#1#g'
5、sed之删去
d delete 删去sed指令删去功能依照行为单位进行
假如只是删去某一行的一些字符引荐运用's#[a-z]##g'
扫除/删去文件中的空行和带注释的行
egrep -v '^$|^#' sshd_config
sed -r '/^$|^#/d' sshd_config
awk '! /^$|^#/' sshd_config
6、sed之增加
cai
- a append 在指定行后边追加内容
- i insert 在指定行上面插入一行
- c replace 替换指定行的内容
[root@nanjing ~]# cat tx.txt
101,shi,CEO
102,wu,CTO
103,bo,COO
104,js,CFO
105,time,CIO
110,gege,COCO
[root@nanjing ~]# sed '3a tianjia' tx.txt
101,shi,CEO
102,wu,CTO
103,bo,COO
tianjia
104,js,CFO
105,time,CIO
110,gege,COCO
[root@nanjing ~]# cat tx.txt
101,shi,CEO
102,wu,CTO
103,bo,COO
104,js,CFO
105,time,CIO
110,gege,COCO
#只需不保存,就不加一个 -i
7、总结
二、三剑客-awk指令
四剑客 | 特点 | 擅长 |
---|---|---|
find | 查找文件 | 查找文件,与其他指令合作 |
grep/egrep | 过滤 | 过滤速度很快 |
sed | 过滤,取行,替换,删去 | 替换,修正文件内容,取行 |
awk | 过滤,取行,取列,核算核算,判断,循环…… | 取行,取列,核算核算 |
1、格局
#取出/etc/passwd中的第1行的第1列,第3列和最终一列
awk -F: 'NR =1{print $1,$3,$NF}' /etc/passwd
awk 选项 '条件{动作}' /etc/passwd
#条件 找谁
#动作 干啥
2、履行流程
3、取行
事例一:取出/etc/passwd的第1行
[root@nanjing ~]# awk 'NR==1' /etc/passwd
[root@nanjing ~]# awk 'NR==1{print $0} ' /etc/passwd
root:x:0:0:root:/root:/bin/bash
NR Number of Record 记录号,行号
== 表明等于
{print $0} 输出整行内容 $0表明当前行的内容、awk满意条件后默认的动作,输出这一行的内容
事例二:取出/etc/passwd的第2行到第5行的内容
awk 'NR>=2 && NR<=5' /etc/passwd
>= 表明大于等于
&& 表明而且
|| 表明或许
awk常用运算符 | 阐明 |
---|---|
== | 等于 |
!= | 不等于 |
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
&& | 而且 |
| | | 或许 |
事例三:过滤出/etc/passwd文件中包括root或nobody的行
awk '/root/ || /nobody/' /etc/passwd
awk '/root|nobody/' /etc/passwd
事例四:从包括root的行到包括nobody的行
awk '/root/,/nobody/' /etc/passwd
4、取列
事例一:运用awk取出 ls -lh 的大小列和最终一列
ls -lh | awk '{print $5,$9}'| column -t
awk中取列的时分阐明:
- 数字,表明取列,数字,表明取列,1 第1列; $0表明这一行.
- $NF 最终一列
- NF Number of Field 每行有多少列
- $(NF-1) 取出倒数第2列,一般用于正向取发生变化或数字过大.
awk输出与对齐:
- 运用column -t 指令即可或许运用 t
事例二:取出/etc/passwd中的第1列,第3列和最终一列
awk取列的时分,默认是经过空白字符进行分割的.
空白字符:空格,接连空格,tab键.
但是一些时分运用默认分隔符不够了,需求咱们手动指定分隔符,经过
-F
选项指定. 未来咱们想快速取出想要的内容,挑选趁手东西(选好分隔符).挑选分隔符主张: 看你方针两边是啥
awk -F':' '{print$1,$3,$NF}' /etc/passwd | column -t
事例三:指定杂乱分隔符取出 ip
ip a s eth0 | awk 'NR==3'| awk '{print $2}' | awk -F '/' '{print$1}'
#不加-F指定分隔符,依照直意了解
ip a s eth0 | awk -F '[ /]' 'NR==3{print $6}'
ip a s eth0 | awk -F '[ /]+' 'NR==3{print $3}'
#+号 接连的空格
5、取行和取列
awk 格局'条件{动作}
事例一:取行+取列 取ip地址
ip a s eth0 | awk -F '[ /]+' 'NR==3{print $3}'
事例二:取出权限部分 stat /etc/hosts的0644部分
stat /etc/hosts | awk -F '[(/]' 'NR==4{print $2}'
事例三:取出/etc/passwd文件中第3列大于100的行,取出这行的第1列,第3列和最终列
awk -F ':' '$3>=1000{print $1,$3,$NF}' /etc/passwd | column -t
经过awk完结对某一列进行判断,然后进行提取.
事例四:假如体系swap运用超过0则输出”反常体系开端占用swap
free | awk 'NR==3 && $3>0{print "反常体系开端占用swap"}'
事例五:过滤出/etc/passwd第4列的数字是以0或1最初的行,输出第1列,第3列,第4列
awk -F ':' '$4~/^[01]/{print $1,$3,$4}' /etc/passwd
温馨提示 awk中 经过~能够完结对某一列进行过滤 某一列中含有xxxx内容
~
表明包括的意思$1 ~ /root/
表明第1列中包括root
!~
表明不包括
6、awk的核算与核算
awk进行核算有2类事例:
- 类似于wc -l核算次数.
- 进行求和,累加.
事例一:核算次数
[root@nanjing ~]# awk '{i=i+1} END{print i}' /etc/passwd
30
[root@nanjing ~]# cat /etc/passwd | wc -l
30
END{}内容会在awk读取完结文件的时分履行.
END{}一般用于输出履行结果.
i=i+1 === i++
事例二:核算总和
seq 10 > num.txt核算num.txt每一行的数字的总和
[root@nanjing ~]# awk '{i=i+$1}END{print i}' num.txt
55