- 1. SED流编辑器
- ">掐头去尾,留中间
- 后项引用的使用方法 sed -nr ‘s/ 狗头(.)尾巴/\1/gp’ \n 代表引用第几个括号
[root@oldboy ~/test]# ifconfig eth0|sed -rn ‘s#^.inet (.) net.$#\1#gp’
10.0.0.100 - 练习取644
[root@oldboy ~/test]# stat /etc/hosts
File: ‘/etc/hosts’
Size: 195 Blocks: 8 IO Block: 4096 regular file
Device: 803h/2051d Inode: 8873533 Links: 2
Access: (0644/-rw-r—r—) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:net_conf_t:s0
Access: 2021-10-01 00:00:47.019002826 +0800
Modify: 2020-09-10 10:06:22.861013547 +0800
Change: 2020-09-27 00:05:33.885665600 +0800
Birth: -
[root@oldboy ~/test]# stat /etc/hosts | sed -rn ‘s#^.(0(.)/-.*$#\1#gp’
644 - 练习取子网掩码
[root@oldboy ~/test]# ifconfig eth0
eth0: flags=4163mtu 1500
inet 10.0.0.100 netmask 255.0.0.0 broadcast 10.255.255.255
inet6 fe80::a39b:4793:644:e2bd prefixlen 64 scopeid 0x20
ether 00:0c:29:bf:1e:0d txqueuelen 1000 (Ethernet)
RX packets 6541 bytes 613038 (598.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4747 bytes 642174 (627.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@oldboy ~/test]# ifconfig eth0|sed -rn ‘s#^.mask (.) br.*$#\1#gp’
255.0.0.0 - 扩展命令cut
- 2. awk
- awk取行操作
- 6 my qq num is 49000448.">取行: && 2-3行(优先sed) NR表示行号,&&并且
[root @web01 test]# awk ‘NR>1&&NR<4’ oldboy.txt
I teach linux.
#取行: ,
[root @web01 test]# cat -n oldboy.txt | awk ‘NR2,NR6’
2 I teach linux.
3
4 I like badminton ball ,billiard ball and chinese chess!
5 our site is rel="nofollow" http://www.oldboyedu.com
6 my qq num is 49000448. - 取一行
[root @web01 test]# awk ‘NR==2’ oldboy.txt
I teach linux. - awk取列操作
- centos7取IP地址:取列取行组合
[root @web01 test]# ifconfig eth0 | awk ‘NR==2{print $2}’
10.0.0.7 - 取行取列操作:
- 练习: 过滤出含有oldboy字符串的行*
- 练习: 删除含有oldboy字符串的行*
- 练习:取出文件的$1,$3,$NF,并打印行号。
- 练习:取出ip gateway netmask
- awk ~ 模糊匹配 符合条件时输出
[root @web01 test]# awk -F “:” ‘$1~/root/ {print $NF}’ /etc/passwd
/bin/bash
1. SED流编辑器
1.1 什么sed
1.2 sed 选项和内置符
sed [选项] | 说明 |
---|---|
-n | 取消默认输出(p搭配使用) |
-i | 修改文件内容(不加只修改打印内容) |
-e | 允许多次编辑 |
-r | 扩展正则 |
sed内置符 | 说明 |
---|---|
a | append,追加文本。在指定行后添加一行或多行文本 |
i | insert,匹配行的文本 |
d | delete,删除匹配内容 |
p | print,通常p会和-n一起使用 |
s/内容/替换内容/g | 全局的内容替换 |
c | 更改[line-address] |
把txt文件中包含test行的 行尾添加 ‘000’
sed -i '/test/ s/$/000/' file
在 某行上或下添加一行 新内容
将某行匹配后替换
sed -i ‘/^SELINUX=/c SELINUX=disabled’ /etc/selinux/config
1.3 sed简单示例
取行(常用)
[root@web01 test]# sed -n ‘2,3p’ oldboy.txt
I teach linux.
搜索
[root@web01 test]# sed -n ‘/oldboy/p’ oldboy.txt
I am oldboy teacher!
our site is http://www.oldboyedu.com
按范围搜索: sed -n ‘/oldboy/,/oldgirl/p’ fanwei.txt (可按时间段搜索)
删除
‘2,8d’删除指定的行(不会删除源文件 -i修改原文件爱你)
[root@web01 test]# sed ‘/oldboy/d’ oldboy.txt
I teach linux.
更改
sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config
EX sed -i ‘/^User/c User www’ /etc/httpd/conf/httpd.conf [root@web01 ~]# grep ‘User www’ /etc/httpd/conf/httpd.conf User www
取值
取IP地址:
ip addr|sed -nr ‘s#^.inet (.)/24.*$#\1#gp’
问题2:过滤出含有oldboy字符串的行※。 [root@oldboy ~/test]# grep “oldboy” oldboy.txt
I am oldboy teacher! our site is http://www.oldboyedu.com [root@oldboy ~/test]# sed -n ‘/oldboy/p’ oldboy.txt
I am oldboy teacher! our site is http://www.oldboyedu.com
1.4 sed正则实践
[root@oldboy ~/test]# sed -n ‘/^$/p’ oldboy.txt
[root@oldboy ~/test]# sed -n ‘/^I/p’ oldboy.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
[root@oldboy ~/test]# sed -n ‘/m$/p’ oldboy.txt
our site is http://www.oldboyedu.com
问题3:删除含有oldboy字符串的行※。 sed ‘/oldboy/d’ oldboy.txt
sed ‘3d’ oldboy.txt #<==删第3行。 sed ‘5,8d’ oldboy.txt #<==删5-8行。利用正则删除空行 sed ‘/^$/d’ oldboy.txt
问题4:将文件中的oldboy字符串全部替换为oldgirl※。
sed ‘s#oldboy#oldgirl#g’ oldboy.txt
问题5:将文件中的oldboy字符串全部替换为oldgirl,同时将QQ号码49000448改为31333741。
sed -e ‘s#oldboy#oldgirl#g’ -e “s#49000448#31333741#g” oldboy.txt
问题6:在oldboy.txt文件的第2行后追加文本。
自动化操作用到。。
sed ‘2a I teacher linux.’ oldboy.txt
问题7:在oldboy.txt文件的第2行插入文本。
解答:这是考察sed命令的i字符功能,示例如下。
sed ‘2i I teacher linux,at 2i.’ oldboy.txt
问题8:在oldboy.txt文件的第2行插入两行文本。
sed ‘2i I teacher linux.\nYou are my student.’ oldgirl.txt
ssh连接优化:
Linux 远程连接慢如何解决: 备份: cp /etc/ssh/sshd_config{,.ori} vim /etc/ssh/sshd_config 修改如下: UseDNS no GSSAPIAuthentication no 保存,重启sshd服务, systemctl restart sshd /etc/ssh/sshd_config Port 22 ListenAddress 10.0.0.100 sed ‘13i Port 22\nListenAddress 10.0.0.100’
sed配合正则的一些案例:
[root@oldboy ~/test]# cat oldboy.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
[root@oldboy ~/test]# sed -n ‘/oldboy/p’ oldboy.txt
I am oldboy teacher!
our site is http://www.oldboyedu.com
过滤空行:
[root@oldboy ~/test]# sed -n ‘/^$/p’ oldboy.txt
过滤以m结尾
[root@oldboy ~/test]# sed -n ‘/m$/p’ oldboy.txt
our site is http://www.oldboyedu.com
过滤以I开头
[root@oldboy ~/test]# sed -n ‘/^I/p’ oldboy.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
[root@oldboy ~/test]# sed -n ‘/^I/d’ oldboy.txt
贪婪
^. 以任意多个字符开头
.$ 以任意多个字符结尾
1.5 sed取IP地址
[root@oldboy ~/test]# ifconfig eth0
eth0: flags=4163
inet 10.0.0.100 netmask 255.0.0.0 broadcast 10.255.255.255
inet6 fe80::a39b:4793:644:e2bd prefixlen 64 scopeid 0x20
ether 00:0c:29:bf:1e:0d txqueuelen 1000 (Ethernet)
RX packets 5431 bytes 509956 (498.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3919 bytes 550320 (537.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@oldboy ~/test]# ifconfig eth0|sed -n ‘2p’
inet 10.0.0.100 netmask 255.0.0.0 broadcast 10.255.255.255
[root@oldboy ~/test]# ifconfig eth0|sed -n ‘2p’|sed ‘s#^.inet ##g’
10.0.0.100 netmask 255.0.0.0 broadcast 10.255.255.255
[root@oldboy ~/test]# ifconfig eth0|sed -n ‘2p’|sed ‘s#^.inet ##g’|sed ‘s# net.*$##g’
10.0.0.100
掐头去尾,留中间
后项引用的使用方法 sed -nr ‘s/ 狗头(.)尾巴/\1/gp’ \n 代表引用第几个括号
[root@oldboy ~/test]# ifconfig eth0|sed -rn ‘s#^.inet (.) net.$#\1#gp’
10.0.0.100
练习取644
[root@oldboy ~/test]# stat /etc/hosts
File: ‘/etc/hosts’
Size: 195 Blocks: 8 IO Block: 4096 regular file
Device: 803h/2051d Inode: 8873533 Links: 2
Access: (0644/-rw-r—r—) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:net_conf_t:s0
Access: 2021-10-01 00:00:47.019002826 +0800
Modify: 2020-09-10 10:06:22.861013547 +0800
Change: 2020-09-27 00:05:33.885665600 +0800
Birth: -
[root@oldboy ~/test]# stat /etc/hosts | sed -rn ‘s#^.(0(.)/-.*$#\1#gp’
644
练习取子网掩码
[root@oldboy ~/test]# ifconfig eth0
eth0: flags=4163 mtu 1500
inet 10.0.0.100 netmask 255.0.0.0 broadcast 10.255.255.255
inet6 fe80::a39b:4793:644:e2bd prefixlen 64 scopeid 0x20
ether 00:0c:29:bf:1e:0d txqueuelen 1000 (Ethernet)
RX packets 6541 bytes 613038 (598.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4747 bytes 642174 (627.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@oldboy ~/test]# ifconfig eth0|sed -rn ‘s#^.mask (.) br.*$#\1#gp’
255.0.0.0
inet 10.0.0.100 netmask 255.0.0.0 broadcast 10.255.255.255
inet6 fe80::a39b:4793:644:e2bd prefixlen 64 scopeid 0x20
ether 00:0c:29:bf:1e:0d txqueuelen 1000 (Ethernet)
RX packets 6541 bytes 613038 (598.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4747 bytes 642174 (627.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@oldboy ~/test]# ifconfig eth0|sed -rn ‘s#^.mask (.) br.*$#\1#gp’
255.0.0.0
1.6 sed 后向引用图解
扩展命令cut
命令cut cut OPTION... [FILE]...
用来显示行中的指定部分,cut经常用来显示文件的内容
选项 :-d 指定分隔符
-f 数字,取第几列 (例–f3,6三列和6列 )
-c 按字符取列(空格也算)
https://blog.csdn.net/yangshangwei/article/details/52563123
实现方法1:
[root@web01 test]# cat test.txt
oldboy oldgirl
oldboy oldgirl
oldboy oldgirl
...
[root@web01 test]# cut -d" " -f1,2 test.txt
oldboy oldgirl
oldboy oldgirl
oldboy oldgirl
...
[root@web01 test]# cut -c 1-7,8-14 test.txt
oldboy oldgirl
oldboy oldgirl
...
2. awk
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。
完全体:
awk ‘{print NR}’ filename; 只打印行号
awk ‘{print $0}’ filename; 打印全部行
扩展用法
awk取行操作
取行: && 2-3行(优先sed) NR表示行号,&&并且
[root@web01 test]# awk ‘NR>1&&NR<4’ oldboy.txt
I teach linux.
#取行: ,
[root@web01 test]# cat -n oldboy.txt | awk ‘NR2,NR6’
2 I teach linux.
3
4 I like badminton ball ,billiard ball and chinese chess!
5 our site is http://www.oldboyedu.com
6 my qq num is 49000448.
取一行
[root@web01 test]# awk ‘NR==2’ oldboy.txt
I teach linux.
awk取列操作
默认空格最为分割符
[root@web01 test]# cat test.txt
oldboy oldgirl test
$1 $2 $NF(倒数第二列 $(NF-1))
[root@web01 test]# awk ‘{print $1,$2,$NF}’ test.txt
oldboy oldgirl test
-F 指定分割符
awk取出/etc/passwd 第三列第四列
[root@web01 test]# awk -F “:” ‘{print $3,$4}’ /etc/passwd
998 996
10001 10001
10002 10002
10003 10003
10004 10004
…
centos7取IP地址:取列取行组合
[root@web01 test]# ifconfig eth0 | awk ‘NR==2{print $2}’
10.0.0.7
-F [ ] 指定多种分割条件
[root@web01 test]# awk -F “[ :]” ‘{print $13}’ c6.txt
10.0.0.7
-F [ ]+指定连续出现的多种分割符
[root@web01 test]# cat c6.txt
inet addr:10.0.0.7 Bcast:10.0.0.255 Mask:255.255.255.0
[root@web01 test]# awk -F “[ :]+” ‘{print $4}’ c6.txt
10.0.0.7
-F( | )指定多个组合条件
[root@web01 test]# awk -F “(addr:| Bcast)” ‘{print $2}’ c6.txt
10.0.0.7
-F “[a-z,A-Z: ]+”
取行取列操作:
ifconfig eth0 | awk ‘/inet / {print $2}’
练习: 过滤出含有oldboy字符串的行*
[root@web01 test]# grep ‘oldboy’ oldboy.txt
I am oldboy teacher!
our site is http://www.oldboyedu.com
[root@web01 test]#
[root@web01 test]#
[root@web01 test]# sed -n ‘/oldboy/p’ oldboy.txt
[root@web01 test]# awk ‘/oldboy/‘ oldboy.txt
练习: 删除含有oldboy字符串的行*
[root@web01 test]# sed ‘/oldboy/d’ oldboy.txt
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
[root@web01 test]# awk ‘!/oldboy/‘ oldboy.txt
[root@web01 test]# grep -v ‘oldboy’ oldboy.txt
练习:取出文件的$1,$3,$NF,并打印行号。
[root@web01 test]# awk -F “:” ‘{print $1,$3,$NF,NR}’ /etc/passwd
test 10003 /bin/bash 29
baba 10004 /bin/bash 30
oldgg 10005 /bin/bash 31
…
练习:取出ip gateway netmask
[root@web01 test]# awk -F “[ :]+” ‘{print $4,$6,$8}’ c6.txt
10.0.0.7 10.0.0.255 255.255.255.0
[root@web01 test]# awk -F “(addr:|Bcast:|Mask:)” ‘{print $2,$3,$4}’ c6.txt
10.0.0.7 10.0.0.255 255.255.255.0
[root@web01 test]# ifconfig eth0 | awk -F “[a-z,A-Z: ]+” ‘NR==2{print $2}’
10.0.0.7
awk ~ 模糊匹配 符合条件时输出
[root@web01 test]# awk -F “:” ‘$1~/root/ {print $NF}’ /etc/passwd
/bin/bash
练习:把UID大于1000的用户打印出来。
[root@oldboy ~/test]# awk -F “:” ‘$3>1000{print $1}’ /etc/passwd
oldboy
kkk
oldgirl
gongli
k1
k2
k3
oldboy1
[root@oldboy ~/test]# awk -F “:” ‘$3>1000&&$3<1005{print $1}’ /etc/passwd
#oldgirl
oldboy
练习:数学大于90的打印名字
[root@oldboy ~/test]# cat chengji.txt
姓名 语文 数学 总分
zhangsan 100 99 199
李四 88 77 165
[root@oldboy ~/test]# awk ‘$3>90{print $1}’ chengji.txt
zhangsan
[root@web01 ]# awk -F : ‘$3<10 && $NF~/bash/{print $1}’ /etc/passwd
[root@web01 ]# awk -F : ‘$3<10 && $NF~”/bin/bash”{print $1}’ /etc/passwd
[root@web01 ]# awk -F : ‘$3<10 && $NF==”/bin/bash”{print $1}’ /etc/passwd
root