文本三剑客

1.1 grep的执行原理

========用法1
grep "root" /etc/passwd

# 打开文件,每读一行,都用正则表达式去匹配一下,但凡匹配成功一次,该行就被过滤出来的
root:x:0:0:root:/root:/bin/bash   # 匹配方式是从左向右下行一个单词匹配,向右平移,若上面第一个字母不对,核对紧靠的第二个字母,一次类推。。。
                      root
                     
========用法2
cat test.txt | grep "root"
ps aux | grep ssh

1.2 grep的选项

-n 过滤结果带行号
-q 静默输出
--color  
-i 忽略大小写
-A 2 后两行
-B 2 前两行
-C 2 前后两行
-c 统计过滤成功的行数
-v 取反
-w 匹配整词,打印出来只有这行只有这个单词
-P 指定标志分割
-r/R 递归
-l 匹配成功只打印文件名,失败不打印
# /etc下包含root的文件
[root@localhost ~]# grep -rl "root" /etc/
/etc/passwd
-o 只显示过滤的内容
[root@localhost ~]# grep -o "root" /etc/passwd
root
root
root
root

1.3 语法

grep [选项] [正则] [文件]

二:正则表达式

^ 以。。开头;只匹配开头指定的内容,同行其它不在匹配
$ 以。。结尾
. 匹配任意一个字符
* 左边某个字符出现0次或无穷次 # 左边的字符任意一个出现过即可
.* 匹配没有或者所有 # 从x到x,中间的没有或者任何所有,结尾标识到最后一个
.*? 非贪婪匹配(需要配合grep -P选项才可以使用)# 从x到x,中间若出现过结尾标识即结束
[] 匹配指定范围的任意一个字符
+ 左边那个字符出现1次或无穷次

案例1

^   # 以。。开头;只匹配开头指定的内容,同行其它不在匹配
$   # 以。。结尾

grep -n "^root" /etc/passwd
grep -n "bash$" /etc/passwd

案例2

.    匹配任意一个字符  # 这行只要带有这个组字符即可
*    左边某个字符出现0次或无穷次   # 左边的字符任意一个出现过即可
.*   匹配没有或者所有   # 从x到x,中间的没有或者任何所有,结尾标识到最后一个
.*?  非贪婪匹配(需要配合grep -P选项才可以使用)# 从x到x,中间若出现过结尾标识即结束


# 例1
[root@www1 ~]# cat c.txt 
abc
a+c
a-c
a1c
aaaaaaaaaaaaaaaac
bbbbbbbbc
cccc
dddd
[root@www1 ~]# grep "a.c" c.txt 
abc
a+c
a-c
a1c
aaaaaaaaaaaaaaaac

# 例2
[root@www1 ~]# cat d.txt 
a
ab
abbcccc
abbbbbbbbbbbbbbbbccc
bbbbbbbbbbbbb
aaaaaaaaaaaaaaaab
[root@www1 ~]# 
[root@www1 ~]# grep "ab*" d.txt 
a
ab
abbcccc
abbbbbbbbbbbbbbbbccc
aaaaaaaaaaaaaaaab

# 例3:
[root@www1 ~]# cat e.txt 
a123123213c3123123c
ac
a=-*(0c
cccccca123123c
[root@www1 ~]# grep "a.*c" e.txt 
a123123213c3123123c
ac
a=-*(0c
cccccca123123c
[root@www1 ~]# 

# 例4:
[root@www1 ~]# cat f.txt 
<a href="http://www.baidu.com">我是百度</a><a href="http://www.sina.com.cn">新浪</a>
1111
2222
3333
[root@www1 ~]# grep '".*"' f.txt    # 以”“为分隔,外面改为‘’
<a href="http://www.baidu.com">我是百度</a><a href="http://www.sina.com.cn">新浪</a>
[root@www1 ~]# grep -P '".*?"' f.txt 
<a href="http://www.baidu.com">我是百度</a><a href="http://www.sina.com.cn">新浪</a>
[root@www1 ~]# grep -oP '".*?"' f.txt 
"http://www.baidu.com"
"http://www.sina.com.cn"

案例3

[] 匹配指定范围的任意一个字符

[a1cd2]
[0-9]
[a-z]

# 例1
[root@www1 ~]# cat h.txt 
abc
aBc
a1c
a2c
[root@www1 ~]# grep 'a[a-z]c' h.txt 
abc
[root@www1 ~]# grep 'a[A-Z]c' h.txt 
aBc
[root@www1 ~]# grep 'a[a-zA-Z]c' h.txt 
abc
aBc
[root@www1 ~]# grep 'a[0-9]c' h.txt 
a1c
a2c

# 例2
[root@www1 ~]# cat i.txt 
a+c
a-c
a*c
a/c
a1c
a2c
[root@www1 ~]# grep 'a[+-*/]c' i.txt   # -号的意思是至,所以要用转义,或者直接放最前面或后面
grep: Invalid range end
[root@www1 ~]# grep 'a[+\-*/]c' i.txt 
grep: Invalid range end
[root@www1 ~]# grep 'a[+*/-]c' i.txt 
a+c
a-c
a*c
a/c

# 例3:
[root@www1 ~]# cat i.txt 
a+c
a-c
a*c
a/c
a1c
a2c
a!c
[root@www1 ~]# grep 'a[!+*/-]c' i.txt 
a+c
a-c
a*c
a/c
a!c
[root@www1 ~]# grep 'a[^!+*/-]c' i.txt 
a1c
a2c

2.1 egrep介绍

egrep = grep -E  

案例4

了解知识:egrep扩展性更强,可搭配更多参数

+ 左边那个字符出现1次或无穷次

ab*
ab+

# 例1
[root@www1 ~]# cat d.txt 
a
ab
abbcccc
abbbbbbbbbbbbbbbbccc
bbbbbbbbbbbbb
aaaaaaaaaaaaaaaab
[root@www1 ~]# grep -n 'ab*' d.txt 
1:a
2:ab
3:abbcccc
4:abbbbbbbbbbbbbbbbccc
6:aaaaaaaaaaaaaaaab
[root@www1 ~]# egrep -n 'ab+' d.txt 
2:ab
3:abbcccc
4:abbbbbbbbbbbbbbbbccc
6:aaaaaaaaaaaaaaaab

2.2 脚本中的正则表达式

让用户输入密码只能是数字

#用正则式2个[],=号加上~

# 例1
[root@www1 scripts]# cat 14.sh      
#!/bin/bash

while true
do
    read -p "请输入您的年龄: " age
    
    if [[ $age =~ ^[0-9]+$ ]];then    # 用正则式2个[],=号加上~
        break
    else
        echo "必须输入数字小垃圾"       
    fi
done


echo "后续代码"
[root@www1 scripts]# chmod +x 14.sh 
[root@www1 scripts]# ./14.sh 
请输入您的年龄: asdf
必须输入数字小垃圾
请输入您的年龄: asdf
必须输入数字小垃圾
请输入您的年龄: 123
后续代码

二 :sed编辑器

非交互式/流式编辑器

# 场景1:
定位到某一行,然后将该行的某一部分给替换掉
sed -r "定位+操作" test.txt

sed -r "3s/egon/EGON/gi" test.txt  # i不区分大小写
sed -r "3,5操作" test.txt           # 3到5行
sed -r "1操作;3操作" test.txt        # 3或5行


sed -r "/^[a-zA-Z]/s/egon/EGON/gi" test.txt


# 场景2:
定位到某一行,然后删除

sed -r "1,3d" new.txt
sed -r "/^[0-9]/d" new.txt

# 场景3:
定位到某一行,在该行后添加新的配置
sed -r "1a XXXXXXXXXXXXXXXX" new.txt

# 场景4:
定位到某一行,将整行修改掉
sed -r "1c XXXXXXXXXXXXXXXX" new.txt

场景1案例

[root@www1 ~]# cat new.txt 
xxEgonxxxegonxxxxx
xxx123xxegonxxegonxxx
EgonxxxxdaxegonxxEGONxxx
xxxyyyyxxegonxxxEgOnxx
xxxzzzxxegonxxxxx
xxxhhhhhxxegonxxxxx
[root@www1 ~]# sed -r '3s/egon/666666/' new.txt 															
xxEgonxxxegonxxxxx
xxx123xxegonxxegonxxx
Egonxxxxdax666666xxEGONxxx
xxxyyyyxxegonxxxEgOnxx
xxxzzzxxegonxxxxx
xxxhhhhhxxegonxxxxx
[root@www1 ~]# sed -r '3s/egon/666666/i' new.txt 
xxEgonxxxegonxxxxx
xxx123xxegonxxegonxxx
666666xxxxdaxegonxxEGONxxx
xxxyyyyxxegonxxxEgOnxx
xxxzzzxxegonxxxxx
xxxhhhhhxxegonxxxxx
[root@www1 ~]# sed -r '3s/egon/666666/gi' new.txt 
xxEgonxxxegonxxxxx
xxx123xxegonxxegonxxx
666666xxxxdax666666xx666666xxx
xxxyyyyxxegonxxxEgOnxx
xxxzzzxxegonxxxxx
xxxhhhhhxxegonxxxxx
[root@www1 ~]# sed -ri '3s/egon/666666/gi' new.txt 
[root@www1 ~]# vim new.txt 

场景1案例

[root@www1 ~]# cat new.txt 
xxEgonxxxegonxxxxx
xxx123xxegonxxegonxxx
EgonxxxxdaxegonxxEgOnxxx
xxxyyyyxxegonxxxEgOnxx
xxxzzzxxegonxxxxx
xxxhhhhhxxegonxxxxx
[root@www1 ~]# sed -r '3s/^egon/666/gi' new.txt 
xxEgonxxxegonxxxxx
xxx123xxegonxxegonxxx
666xxxxdaxegonxxEgOnxxx
xxxyyyyxxegonxxxEgOnxx
xxxzzzxxegonxxxxx
xxxhhhhhxxegonxxxxx

场景1案例

[root@www1 ~]# cat new.txt 
xxEgonxxxegonxxxxx
xxx123xxegonxxegonxxx
EgonxxxxdaxegonxxEgOnxxx
xxxyyyyxxegonxxxEgOnxx
xxxzzzxxegonxxxxx
xxxhhhhhxxegonxxxxx
[root@www1 ~]# sed -r '3,5s/egon/666/gi' new.txt 
xxEgonxxxegonxxxxx
xxx123xxegonxxegonxxx
666xxxxdax666xx666xxx
xxxyyyyxx666xxx666xx
xxxzzzxx666xxxxx
xxxhhhhhxxegonxxxxx
[root@www1 ~]# sed -r '3s/egon/666/gi;5s/egon/666/gi' new.txt 
xxEgonxxxegonxxxxx
xxx123xxegonxxegonxxx
666xxxxdax666xx666xxx
xxxyyyyxxegonxxxEgOnxx
xxxzzzxx666xxxxx
xxxhhhhhxxegonxxxxx

三: awk格式化

格式化有规律的文本

awk -F: '定位{}' 文件路径   # -F指定分割符,不加-F默认以空格为分割符
awk -F: 'NR==3{print $1,$7}' /etc/passwd      # 第三行第一列和第七列
awk -F: 'NR>3 && NR<5{print $0}' /etc/passwd  # 第三行和第5行之间的
awk -F: 'NR==3 || NR==5{print $1"-"$3}' /etc/passwd   # 第三行或第五行

awk -F: '/bash$/{print $1}' /etc/passwd    # 以bash结尾的

获取ip地址

[root@www1 ~]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 1.1.1.8  netmask 255.255.255.0  broadcast 1.1.1.255
        inet6 fe80::20c:29ff:fea2:d75e  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:a2:d7:5e  txqueuelen 1000  (Ethernet)
        RX packets 51153  bytes 4323126 (4.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 59883  bytes 64679002 (61.6 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@www1 ~]# ifconfig eth0 | awk 'NR==2{print $1}'
inet
[root@www1 ~]# ifconfig eth0 | awk 'NR==2{print $2}'
1.1.1.8
[root@www1 ~]# ip=`ifconfig eth0 | awk 'NR==2{print $2}'`
[root@www1 ~]# echo $ip
1.1.1.8

四 :expect

交互的命令变为非交互

安装  yum install expect -y

基本语法格式

    expect << EOF
		spawn ssh $user@$ip $cmd   # 需要交互的内容ssh。。

		expect {                                          # 编写交互的具体步骤
		    "yes/no" {send "yes\r";exp_continue}          # 询问\r确认
		    "*assword" {send "1\n"}                       # 询问\n确认
		}

		expect eof
	EOF

远程连接并执行命令脚本

[root@www1 scripts]# cat 15.sh 
#!/bin/bash

expect << EOF
    spawn ssh root@1.1.1.2 hostname

    expect {
	    "yes/no" {send "yes\r";exp_continue}
	    "*assword" {send "1\n"}
    }

    expect eof

EOF
[root@www1 scripts]# chmod +x 15.sh 

五:-stdin 修改密码

echo 123 | passwd egon --stdin    # 修改密码

版权声明:本文为weixin_53832067原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。