shell脚本典型案例

1、统计出现次数最多的ip

[root@foundation51 shell]# cat test.txt 
1  134.102.173.43
2  134.102.173.43
3  134.102.171.42
4  134.102.170.9
[root@foundation51 shell]# cat test.txt | awk '{print $2}'| sort | uniq -c | sort -nr | awk 'NR==1{print $2}'
134.102.173.43

2.awk中关联数组的统计

[root@server6 shell]# cat passwd | awk -F: '{shells[$NF]++};END{for(i in shells) {print i ":" shells[i]}}'
/sbin/shutdown:1
/bin/bash:2
/sbin/nologin:16
/sbin/halt:1
/bin/sync:1

冒号分隔 sort -t:,第2列 -k2,按数字进行排序(从大到小-nr)

[root@server6 shell]# cat passwd | awk -F: '{shells[$NF]++};END{for(i in shells) {print i ":" shells[i]}}'| sort -t: -nr -k2
/sbin/nologin:16
/bin/bash:2
/sbin/shutdown:1
/sbin/halt:1
/bin/sync:1

3.打印字段

[root@server6 shell]# date
Tue Mar  3 00:03:31 CST 2020

[root@server6 shell]# date | awk '{print "Month:" $2 "\nYear:" $NF}'
Month:Mar
Year:2020
[root@server6 shell]# awk -F: '{print "User:" $1 "\tUid:" $3}' passwd 
User:root	Uid:0
User:bin	Uid:1
User:daemon	Uid:2

4.匹配行 / 匹配关键字/
从第一行匹配到以sync开头的行 ($0:打印所有)

[root@server6 shell]# awk 'NR==1,/^sync/ {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
sync:x:5:0:sync:/sbin:/bin/sync
[root@server6 shell]# awk '/^bin/,/^sync/ {print $0}' 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
sync:x:5:0:sync:/sbin:/bin/sync

5.显示5-10行

[root@server6 shell]# awk 'NR>=5 && NR<=10 {print $0}' passwd 
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

打印bash结尾的行

[root@server6 shell]# awk 'NR>=1 && NR<=10 && /bash$/ {print $0}' passwd 
root:x:0:0:root:/root:/bin/bash

6.if语句

[root@server6 shell]# awk -F: '{if($3>=50){print $1,$3}}' passwd 
nobody 99
vcsa 69
saslauth 499
postfix 89
sshd 74

1.查找文件并删除

[root@server6 shell]# find . -name file -exec rm -fr {} \;

1.将文件中以’#'开头的注释行和空行去掉,其他内容显示屏幕并输出到passwd文件中

 "^$"   ## 表示空行
[root@server6 shell]# grep -v "^#" passwd | grep -v "^$"|tee -a passwd 
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
saslauth:x:499:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash

2.打印最后一行

[root@server6 shell]# sed -n '$p' passwd 
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash

1.shell内置变量 $@ $#
$@表示所有参数
$#表示所有参数的个数

[root@localhost xly]# cat t.sh
#!/bin/bash
echo $#
echo $@
[root@localhost xly]# sh t.sh
0
[root@localhost xly]# sh t.sh a b c
3
a b c

2.shell内置变量

当 $* 和 $@ 不被双引号" "包围时,它们之间没有任何区别,都是将接收到的每个参数看做一份数据,彼此之间以空格来分隔。

但是当它们被双引号" "包含时,就会有区别了:
    "$*"会将所有的参数从整体上看做一份数据,而不是把每个参数都看做一份数据。
    "$@"仍然将每个参数都看作一份数据,彼此之间是独立的。
    #!/bin/bash
    echo "print each param from \"\$*\""
    for var in "$*"
    do
        echo "$var"
    done
    echo "print each param from \"\$@\""
    for var in "$@"
    do
        echo "$var"
    done

测试:

[mozhiyan@localhost demo]$ . ./test.sh a b c d
print each param from "$*"
a b c d
print each param from "$@"
a
b
c
d

1.定义函数并传参

    #!/bin/bash
    function getsum(){
        local sum=0
        for n in $@
        do
             ((sum+=n))
        done
        return $sum
    }
    getsum 10 20 55 15  #调用函数并传递参数,参数空格分隔,不加括号
    echo $?   #运行结果的返回值,即sum

运行结果:

运行结果:
100

1.查看使用内存最多的10个进程
ps -aux中(a指代all——所有的进程,u指代userid——执行该进程的用户id,x指代显示所有程序,不以终端机来区分)

ps -aux | sort -k4 -nr | head -n 10

2.查看使用CPU最多的10个进程

p**加粗样式**s -aux | sort -k3 -nr | head -n 10

经典面试题:
1.判断并匹配ip地址
因为有 | 和 ?,所以使用扩展正则**-E**
? :出现0次或1次
[01] :0或者1

[root@server6 shell]# grep -E "((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9]?)" passwd 
172.2.3.44
  • 第一个字符是2,第二个字符是5,第三个字符是0到5。表示250~255。
  • 第一个字符是2,第二个字符是0到4,第三个字符是任意一位数字。表示200~249。
  • 第一个字符是0,或者1,或者可以没有这个字符,第二个字符是任意一位数字,第三个字符是任意一位数字,可以没有这个字符。表示1~199,可以有前导零。
  • “|”代表“或者”的意思,只要满足三块中的任意一块的意思。

2.过滤ip地址

[root@server6 shell]# sed -rn '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' passwd 
172.2.3.44

find命令:
+5:5天以前
-5:5天以内
最近访问时间 access time (-atime)、最近更改时间 modify time (-mtime) 和 最近状态改动时间 change time(-ctime)

atime  : 它代表着最近一次访问文件的时间,显示一个文件的内容或者运行一个shell脚本会更新文件的atime。
mtime : 它代表着最近一次文件内容被修改的时间。可用ls -l 命令查看。
ctime  : 它代表着最近一次文件状态改变的时间 ,是在写入文件、更改所有者、权限或链接设置时随 Inode 的内容更改而更改,即文件状态最后一次被改变的时间。可用ls -lc 命令查看。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值