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 命令查看。