shell四剑客入门

一、            shell四剑客之(grep

grep 抓取行

正则表达式:

[0-9]表示字符匹配0-9

{1,3}表示匹配字符数量再3个以内。

 

例一:

[root@bogon bash]# cat test.txt      #源文件

my name is lingshu

MySQL install

192.168.1.11

192.168.2.

10.28

172.16.22.34

hello word

[root@bogon bash]# grep "^10" test.txt    #表示以10开头的行

10.28

[root@bogon bash]# grep "11$" test.txt    #表示以11结尾的行

192.168.1.11

[root@bogon bash]# grep "[0-9]" test.txt    #表示有匹配0-9字符的行

192.168.1.11

192.168.2.

10.28

172.16.22.34

[root@bogon bash]# grep "[0-9][0-9]" test.txt   #表示匹配连续两个0-9的字符所在的行

192.168.1.11

192.168.2.

10.28

172.16.22.34

[root@bogon bash]# grep "[0-9][0-9][0-9]" test.txt   #便是匹配连续三个0-9的字符所在的行

192.168.1.11

192.168.2.

172.16.22.34

[root@bogon bash]# grep "[a-z]" test.txt   #表示匹配所有小写字母所在的行

my name is lingshu

MySQL install

hello word

[root@bogon bash]# grep "^[a-z]" test.txt  #表示匹配以小写字母开头的行

my name is lingshu

hello word

[root@bogon bash]# grep "^[A-Z]" test.txt  #表示匹配以大写字母开头的行

MySQL install

[root@bogon bash]# echo "168" >> !$

echo "168" >> test.txt

[root@bogon bash]# grep "168" test.txt

192.168.1.11

192.168.2.

168

[root@bogon bash]# grep "^168$" test.txt  #以168开头且结尾的行

168

[root@bogon bash]# cat test.txt | grep -E "[0-9]{1,3}"  连续一到三个数,并且是符合0-9

192.168.1.11

192.168.2.

10.28

172.16.22.34

168

[root@bogon bash]# cat test.txt | grep -E "[0-9]{1,3}\."    #连续一到三个数,并且是符合0-9,且后跟小数点的数

192.168.1.11

192.168.2.

10.28

172.16.22.34

[root@bogon bash]# cat test.txt | grep -E "([0-9]{1,3}\.){3}"     ##连续一到三个数,并且是符合0-9,且后跟小数点的数 ;这样的数连续三次

192.168.1.11

192.168.2.

172.16.22.34

[root@bogon bash]# cat test.txt | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}"    #连续一到三个数,并且是符合0-9,且后跟小数点的数 ;这样的数连续三次以后再加一个,一到三个0-9的数

192.168.1.11

172.16.22.34

[root@bogon bash]# grep -E "192|lingshu" test.txt   #-E “参数1 |参数2” 表示匹配参数1或参数2的行。也可写成egrep “192 | lingshu” test.txt  

my name is lingshu

192.168.1.11

192.168.2.

 

二、            shell四剑客之(awk

awk抓取列

实例一:抓取IP

[root@bogon bash]# cat ip.txt

localhost 127.0.0.1 24

guanli 192.168.3.2 24

yewu 192.168.4.9 24

mysql 172.16.10.10 24

[root@bogon bash]# awk '{print $2}' ip.txt    #$2表示抓取第二列 $NF表示最后一列。

127.0.0.1

192.168.3.2

192.168.4.9

172.16.10.10

[root@bogon bash]# awk '{print "ip:"$2}' ip.txt   #支持加注释

ip:127.0.0.1

ip:192.168.3.2

ip:192.168.4.9

ip:172.16.10.10

例二:分割抓取用户列表

[root@bogon bash]# tail /etc/passwd

setroubleshoot:x:993:990::/var/lib/setroubleshoot:/sbin/nologin

pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin

gdm:x:42:42::/var/lib/gdm:/sbin/nologin

gnome-initial-setup:x:992:987::/run/gnome-initial-setup/:/sbin/nologin

sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin

postfix:x:89:89::/var/spool/postfix:/sbin/nologin

ntp:x:38:38::/etc/ntp:/sbin/nologin

tcpdump:x:72:72::/:/sbin/nologin

lingshu:x:1000:1000:LingShu:/home/lingshu:/bin/bash

[root@bogon bash]# tail /etc/passwd | awk -F: '{print $1}'  #-F:表示以冒号:做分割

setroubleshoot

pulse

gdm

gnome-initial-setup

sshd

avahi

postfix

ntp

tcpdump

lingshu

[root@bogon bash]# tail -n 2 /etc/passwd | awk -F: '{print $1}' > user.txt  #抓去最后两个并生成用户列表

[root@bogon bash]# cat !$

cat user.txt

tcpdump

lingshu

 

三、            shell四剑客之(sed

sed更改字符

表示符:

/lingshu     #表示匹配翎戍

s/lingshu     #加s表示匹配所有翎戍

^            #表示行首

$            #表示行尾

/g           #表示更改

/a           #表示在行后

/i            #表示在行前

\n           #表示换行

grep     表示筛选。-v参数表示筛选相反值。

p   [print]  #表示打印

sort    #表示排序。默认按首字符排序。-nr表示从大到小排

例一:

[root@bogon bash]# cat test.txt    #源文件

my name is lingshu

 

this is my first sciptis!

192.168.1.11

192.168.2.23

 

172.16.22.34

hello word

[root@bogon bash]# sed 's/192.168/172.16/g' test.txt    #表示将所有的192.168替换为172.16 

my name is lingshu

 

this is my first sciptis!

172.16.1.11

172.16.2.23

 

172.16.22.34

hello word

[root@bogon bash]# sed 's/^/id /g' test.txt    #表示将行首替换为id空格。(空行也添加)    

id my name is lingshu

id

id this is my first sciptis!

id 192.168.1.11

id 192.168.2.23

id

id 172.16.22.34

id hello word

[root@bogon bash]# sed 's/$/ id/g' test.txt    #表示将在行尾添加空格id(同样空行也添加)

my name is lingshu id

 id

this is my first sciptis! id

192.168.1.11 id

192.168.2.23 id

 id

172.16.22.34 id

hello word id

[root@bogon bash]# sed 's/^/# /g' test.txt     #实用:全部注释

# my name is lingshu

#

# this is my first sciptis!

# 192.168.1.11

# 192.168.2.23

#

# 172.16.22.34

# hello word

[root@bogon bash]# sed '/lingshu/a 333333333333' test.txt  #表示匹配到lingshu,然后在翎戍的行后添加一行333333333333333

my name is lingshu

333333333333

 

this is my first sciptis!

192.168.1.11

192.168.2.23

 

172.16.22.34

hello word

[root@bogon bash]# sed '/lingshu/i 333333333333' test.txt #表示匹配到lingshu,然后在翎戍的行前添加一行333333333333333

333333333333

my name is lingshu

 

this is my first sciptis!

192.168.1.11

192.168.2.23

 

172.16.22.34

hello word

[root@bogon bash]# cat test.txt

my name is lingshu

 

this is my first sciptis!

192.168.1.11

192.168.2.23

 

172.16.22.34

hello word

然而我们发现与源文件并没有什么不一样。这些只是缓存生成,预修改。并没有真正的更改。如果需要真正的修改,需要加-i 参数。

 例二:-n+p 的方式打印输出

[root@bogon bash]# sed -n '/lingshu/p' test.txt    #打印带有lingshu这一行

my name is lingshu

[root@bogon bash]# sed -n '1p' test.txt     #1p表示打印第一行

my name is lingshu

[root@bogon bash]# sed -n '1,4p' test.txt    #表示打印1-4行

my name is lingshu

 

this is my first sciptis!

192.168.1.11

[root@bogon bash]# sed -n '1p;4p' test.txt  #分号表示打印第一行和第四行

my name is lingshu

192.168.1.11

 

例三:查找文件中最大和最小的数字

[root@bogon bash]# cat number.txt    #源文件

123

345 45 5

1324

 

12 4354 253

24  4253

131   24

[root@bogon bash]# cat number.txt | sed 's/ /\n/g'     #首先将空格替换成换行。

123

345

45

5

1324

 

12

4354

253

24

 

4253

131

 

 

24

[root@bogon bash]# cat number.txt | sed 's/ /\n/g' | grep -v "^$"  #表示筛选出空格

123

345

45

5

1324

12

4354

253

24

4253

131

24

[root@bogon bash]# cat number.txt | sed 's/ /\n/g' | grep -v "^$" | sort   sort表示排列。默认按首字符排

12

123

131

1324

24

24

253

345

4253

4354

45

5

[root@bogon bash]# cat number.txt | sed 's/ /\n/g' | grep -v "^$" | sort -nr #参数-nr表示从大到小排

4354

4253

1324

345

253

131

123

45

24

24

12

5

[root@bogon bash]# cat number.txt | sed 's/ /\n/g' | grep -v "^$" | sort -nr |sed -n '1p;$p'排完再用sed取第一行和最后一行的值。

4354

5

 

综合一:抓取网卡ens33的IP地址

[root@bogon bash]# ifconfig ens33

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet 172.16.200.99  netmask 255.255.248.0  broadcast 172.16.207.255

        inet6 fe80::21cb:60a3:1caa:d4c9  prefixlen 64  scopeid 0x20<link>

        ether 00:0c:29:51:c5:f6  txqueuelen 1000  (Ethernet)

        RX packets 1280778  bytes 95144158 (90.7 MiB)

        RX errors 0  dropped 37  overruns 0  frame 0

        TX packets 2276  bytes 141670 (138.3 KiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

 

 [root@bogon bash]# ifconfig ens33 |grep "netmask"  #确定行

        inet 172.16.200.99  netmask 255.255.248.0  broadcast 172.16.207.255

 [root@bogon bash]# ifconfig ens33 |grep "netmask" |awk '{print $2}'  确定列

172.16.200.99

案例二:抓取跟目录的使用率不要%

[root@bogon bash]# df -h

文件系统                 容量  已用  可用 已用% 挂载点

/dev/mapper/centos-root   30G   13G   18G   41% /

devtmpfs                 2.0G     0  2.0G    0% /dev

tmpfs                    2.0G     0  2.0G    0% /dev/shm

tmpfs                    2.0G  9.1M  2.0G    1% /run

tmpfs                    2.0G     0  2.0G    0% /sys/fs/cgroup

/dev/mapper/centos-home  5.8G   39M  5.8G    1% /home

/dev/sda1                197M  139M   59M   71% /boot

tmpfs                    394M   36K  394M    1% /run/user/0

[root@bogon bash]# df -h | grep "/$"   #确定行

/dev/mapper/centos-root   30G   13G   18G   41% /

[root@bogon bash]# df -h | grep "/$" | awk '{print $5}'   #确定列

41%

[root@bogon bash]# df -h | grep "/$" | awk '{print $5}'|sed 's/%//g'  #将%替换成空格

41    #最终需要的数值。

 

四、            shell四剑客之(find

find查找文件

参数:

-maxdepth  表示目录级别

-name      表示按文件名查找

-type       表示文件类型 -f普通文件 -d目录

-mtime      按照修改时间 +30表示30天以前 -30表示30天以内

-size        表示按大小查找。+20M大于20M的文件。

承接命令:-exec

用法格式:

-exec [命令] {} \;    查找文件后跟-exec表示承接,后跟要操作的命令 {}:查找到的结果,\;反斜杠分号结尾。

例一:查找当前目录下.txt结尾的文件并移到/document目录下 

[root@bogon bash]# find . -name "*.txt"

./number.txt

./test.txt

./ip.txt

./user.txt

[root@bogon bash]# find . -name "*.txt" -exec mv {} /document/ \;

[root@bogon bash]# ls /document/

bash  ip.txt  number.txt  test  test.txt  user.txt  yum.repo.d

[root@bogon bash]# ls

array.sh

例二:删除当前目录下30天以前的文件

[root@bogon bash]# find . -mtime +30 -exec rm -rf {} \;

xargs 与-exec类似;

区别,可能是一个用于目录一个用于文件

[root@bogon test]# find . -maxdepth 1 -size +20M -exec cp {} / \;

[root@bogon test]# find . -maxdepth 1 -size +20M | xargs cp {} / \;

cp: 目标"./mysql-5.7.13.tar.gz" 不是目录

posted @ 2018-04-30 14:15  翎戍  阅读(227)  评论(0编辑  收藏  举报