目录
1.1.1、read可以同时接受用户输入的多个值,赋值给多个变量
7.1、sort是一个排序的命令。默认情况下,根据每一一行的首字母进行排序。
8.3.1、查询访问本网站最多的IP地址,统计出访问量最大的3个IP地址
1、如何往脚本里传递参数
shelll里往文件里传递参数的方法:
1、read;2、位置变量;3、导入文件 --》while
python里往文件里传递参数的方法:
1、input;2、文件IO;3、位置变量,sys.argv。sys模块是专门对python进行处理的模块。什么叫做模块(库):就是一个.py文件,里边有很多函数。OS模块是专门对操作系统进行处理的模块。
1.1、read + 参数
[root@fttsaxf ~]# read num
1
[root@fttsaxf ~]# echo $num
1
1.1.1、read可以同时接受用户输入的多个值,赋值给多个变量
[root@fttsaxf while_import_file]# read -p "请输入用户名和密码:" u_name u_pwd
请输入用户名和密码:feng 123456
[root@fttsaxf while_import_file]# echo $u_name
feng
[root@fttsaxf while_import_file]# echo $u_pwd
123456
1.2、位置变量
$1、$2......
1.2.1、位置变量传参的形式
[root@fttsaxf script]# cat position.sh
#!/bin/bash
echo "第一个位置变量 $1"
echo "第二个位置变量 $2"
echo "第三个位置变量 $3"
echo "所有位置变量的内容:$*"
echo "位置变量的数量:$#"
echo "脚本名字是:$0"
[root@fttsaxf script]# bash position.sh fan feng love
第一个位置变量 fan
第二个位置变量 feng
第三个位置变量 love
所有位置变量的内容:fan feng love
位置变量的数量:3
脚本名字是:position.sh
1.2.2、位置变量关于字符串的匹配
[root@fttsaxf script]# cat casev2.sh
#!/bin/bash
case $1 in
start)
echo "启动程序"
;;
stop)
echo "关闭程序"
;;
restart|reload)
echo "重启程序"
;;
*)
echo "请检查输入是否正确"
;;
esac
[root@fttsaxf script]# bash casev2.sh start
启动程序
[root@fttsaxf script]# bash casev2.sh stop
关闭程序
[root@fttsaxf script]# bash casev2.sh reload
重启程序
[root@fttsaxf script]# bash casev2.sh 1235
请检查输入是否正确
1.3、python的sys.argv用法
[root@fttsaxf script]# cat position.py
import sys
# 输出所有的位置变量
# sys.argv代表所有的位置变量 --》相当于shell里的$*
print(sys.argv)
print("#" * 50)
# 使用for循环,一个一个的输出位置变量
for i in sys.argv:
print(i)
[root@fttsaxf script]# python3 position.py feng liu shi jin
['position.py', 'feng', 'liu', 'shi', 'jin']
##################################################
position.py
feng
liu
shi
jin
2、while
while无限循环的两种格式:
1、while : 注意:"while" 和 ":" 之间有一个空格
2、while true
2.1、while的各种用法
2.2、while导入文件内容的功能
[root@fttsaxf while_import_file]# cat student_info.txt
name age sex grade
cali 36 m 80
liyu 24 m 90
ly 20 f 93
[root@fttsaxf while_import_file]# cat while_import_file.sh
#!/bin/bash
# 方法一:导入
while read u_name u_age u_sex u_grade
do
echo -e "名字是$u_name \t性别是$u_sex \t年龄为$u_age \t分数是$u_grade"
done < student_info.txt
echo "#####################"
# 方法二:
cat student_info.txt | while read u_name u_age u_sex u_grade
do
echo -e "名字是$u_name \t性别是$u_sex \t年龄为$u_age \t分数是$u_grade"
done
[root@fttsaxf while_import_file]# bash while_import_file.sh
名字是name 性别是sex 年龄为age 分数是grade
名字是cali 性别是m 年龄为36 分数是80
名字是liyu 性别是m 年龄为24 分数是90
名字是ly 性别是f 年龄为20 分数是93
#####################
名字是name 性别是sex 年龄为age 分数是grade
名字是cali 性别是m 年龄为36 分数是80
名字是liyu 性别是m 年龄为24 分数是90
名字是ly 性别是f 年龄为20 分数是93
3、字符串的比较
[[]],双中括号
[root@fttsaxf rough_book]# cat if.sh
read -p "请输入你的名字:" name
if [[ $name == "root" ]]
then
echo "welcome to login"
else
echo "请输入正确的用户名"
fi
[root@fttsaxf rough_book]# bash test
请输入你的名字:rot^Ho^H
请输入正确的用户名
[root@fttsaxf rough_book]# bash if.sh
请输入你的名字:root
welcome to login
3.1、数值比较
(()),双圆括号
[root@fttsaxf while_import_file]# cat test
#!/bin/bash
if (( $1 > $2))
then
echo "第一个数大于第二个数"
else
echo "第一个数小于第二个数"
fi
[root@fttsaxf while_import_file]# bash test 1 2
第一个数小于第二个数
4、管道符号
定义:连接左右两个命令,将左侧的命令的标准输出,作为右侧命令的标准输入
格式:cmd1 | cmd2...
4.1、默认情况下管道符号只会传递正确的输出
默认情况下,管道会把前边正确的输出作为后边命令的输入
[root@fttsaxf for_while.sh]# cat while.sh | grep "if"
if ((k==3));then #;可以进行命令连接
if ((k==8));then
[root@fttsaxf for_while.sh]# cat while.shdfas | grep "if"
cat: while.shdfas: 没有那个文件或目录
4.2、怎么才能使错误的输出也被传递呢(2>&1)
那怎么才能使错误的输出也能够作为后便命令的输入
4.3、默认情况下,进程和进程之间是不能随便访问的
进程和进程之间通信的方式:1、管道 pipe;2、
4.3.1、通信方法之——管道
[root@fttsaxf for_while.sh]# find / -type "p" # 在根目录下查找文件类型为管道的文件
[root@fttsaxf for_while.sh]# ll /run/dmeventd-client
prw-------. 1 root root 0 2月 12 10:59 /run/dmeventd-client
'''
- 表示普通的文本文件
d 表示目录 directory
l 表示链接文件 link
p 表示管道文件 --》 存放在内存中
c 表示字符设备文件 character
b 表示块设备文件 block
s 表示socket文件 --》 存放在磁盘中
'''
图片说明:这个管道文件也是在内存中的,这样画只是为了方便理解。
4.3.2、通信方法之——socket文件
4.3.3、查看挂载的系统
[root@fttsaxf for_while.sh]# df -a
4.3.4、查看linux里的分区的使用情况
[root@fttsaxf lucky_draw]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 898M 0 898M 0% /dev
tmpfs tmpfs 910M 0 910M 0% /dev/shm
tmpfs tmpfs 910M 9.7M 901M 2% /run
tmpfs tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 17G 2.7G 15G 16% /
/dev/sda1 xfs 1014M 151M 864M 15% /boot
tmpfs tmpfs 182M 0 182M 0% /run/user/0
4.4、文本编辑3种方法
1、grep --》过滤
2、awk --》截取行里的字段,一个字段代表一列
3、sed --》替换
[root@fttsaxf while_import_file]# cat student_info.txt
name age sex grade
cali 36 m 80
liyu 24 m 90
ly 20 f 93
[root@fttsaxf while_import_file]# cat student_info.txt | awk '{print $4}'
grade
80
90
93
'''
awk 是截取命令
'{}' 是固定的语法
print 是awk里的命令,用来输出内容
$4 表示第4个字段
awk 默认的字段和字段之间的分隔符是空白(空格、tab、回车)
'''
[root@fttsaxf while_import_file]# cat student_info.txt | awk '{print $0$4}'
name age sex gradegrade
cali 36 m 8080
liyu 24 m 9090
ly 20 f 9393
[root@fttsaxf while_import_file]# cat student_info.txt | awk '{print $0,$4}'
name age sex grade grade
cali 36 m 80 80
liyu 24 m 90 90
ly 20 f 93 93
# ','是输出的时候使用一个空格作为分隔符
4.5、同时显现出两个文件的内容
[root@fttsaxf while_import_file]# cat test
#!/bin/bash
if (( $1 > $2))
then
echo "第一个数大于第二个数"
else
echo "第一个数小于第二个数"
fi
[root@fttsaxf while_import_file]# cat <test ;cat student_info.txt
#!/bin/bash
if (( $1 > $2))
then
echo "第一个数大于第二个数"
else
echo "第一个数小于第二个数"
fi
name age sex grade
cali 36 m 80
liyu 24 m 90
ly 20 f 93
4.5.1、;
命令连接符号,可以将多个命令写到一行。
cmd1;cmd2;cmd3 先执行cmd1再执行cmd2最后执行cmd3,不管前面的命令是否执行成功,都会执行
[root@fttsaxf while_import_file]# cd gjasl;echo love;cd sig
-bash: cd: gjasl: 没有那个文件或目录
love
-bash: cd: sig: 没有那个文件或目录
4.5.2、&&和||
cmd1 && cmd2 如果cmd1执行成功,就执行cmd2,如果执行不成功不执行cmd2
cmd1 || cmd2 如果cmd1不执行成功,就执行cmd2,如果执行成功不执行cmd2
cmd1 && cmd2 || cmd3 如果cmd1执行成功,就执行cmd2,如果执行不成功就执行cmd3
[root@fttsaxf while_import_file]# mkdir love && echo yes || echo no
yes
[root@fttsaxf while_import_file]# mkdir love && echo yes || echo no
mkdir: 无法创建目录"love": 文件已存在
no
4.5.3、小练习(&&和||)
1.判断用户feng是否存在,如果存在就设置密码,不存在就新建用户feng
id feng &>/dev/null && echo 123456|passwd feng --stdin || useradd feng
2.判断目录/backup是否存在,如果存在就不新建,不存在就新建/backup目录
[ -d /backup ] || mkdir /backup
cd /backup || mkdir /backup
mkdir -p /backup
这三个答案在shell中都可以
在python里如何判断一个目录是否存在?
可以用os.path.exists()
>>> os.path.exists("/backup")
False
>>> os.mkdir("/backup")
>>> os.path.exists("/backup")
True
[root@fttsaxf rough_book]# cat dir.py
#!/usr/bin/python3
import os
if os.path.exists("/backup"):
print("/backup is exists")
else:
os.mkdir("/backup")
print("/backup create ok")
3.统计整个linu根目录的大小,不要显示错误的信息
[root@fttsaxf while_import_file]# du -sh / 2>/dev/null
2.8G /
5、xargs
有些命令对管道符号的支持不是很好
5.1、xargs与管道符号的比较
管道:将前边命令的输出送给后边的命令使用
xargs:将前边命令的输出送给后边命令作为参数使用
注意:在使用xargs的时候不能够使用命令的别名(alias)
[root@fttsaxf rough_book]# which mkdir | ls -l # 这里显示的是rough_book里的文件信息
总用量 8
-rw-r--r--. 1 root root 144 2月 12 20:32 dir.py
-rw-r--r--. 1 root root 20 2月 9 11:25 new
[root@fttsaxf rough_book]# ll /usr/bin/mkdir
-rwxr-xr-x. 1 root root 79768 8月 20 2019 /usr/bin/mkdir
[root@fttsaxf rough_book]# which mkdir | xargs ls -l # xargs 将前边的命令的结果作为后边命令的参数
-rwxr-xr-x. 1 root root 79768 8月 20 2019 /usr/bin/mkdir
#xargs还是需要依赖管道,只是将前面的命令的输出送给后面的命令做参数使用而已,更加的精准了。让一些不支持管道的命令,也可以使用管道了。
6、tr
[root@fttsaxf lucky_draw]# echo 1234511253 | tr 123 abc # 不要把123认为是一个整体,它就是单个字符对应替换
abc45aab5c
[root@fttsaxf rough_book]# cat test
1122334411
[root@fttsaxf rough_book]# tr "11" "aa" test
tr: 额外的操作数 "test"
Try 'tr --help' for more information.
[root@fttsaxf rough_book]# tr "11" "aa" <test
aa223344aa
[root@fttsaxf rough_book]# cat test
1122334411
"""
缺陷:需要用管道符号或者"<"给tr传递参数,且若是对文本进行替换,只是显示替换的效果,并不会对其进行修改
"""
6.1、属于linux的通配符含义
[root@fttsaxf rough_book]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@fttsaxf rough_book]# cat /etc/hosts|tr "[a-z]" "[A-Z]"
127.0.0.1 LOCALHOST LOCALHOST.LOCALDOMAIN LOCALHOST4 LOCALHOST4.LOCALDOMAIN4
::1 LOCALHOST LOCALHOST.LOCALDOMAIN LOCALHOST6 LOCALHOST6.LOCALDOMAIN6
[root@fttsaxf rough_book]# cat /etc/hosts|tr "[0-9]" " "
. . . localhost localhost.localdomain localhost localhost .localdomain
:: localhost localhost.localdomain localhost localhost .localdomain
[root@fttsaxf rough_book]# cat /etc/hosts|tr "[0-9.]" " " # 删除0-9和"."
localhost localhost localdomain localhost localhost localdomain
:: localhost localhost localdomain localhost localhost localdomain
[root@fttsaxf rough_book]# cat /etc/hosts|tr "[0-9.:]" " "
localhost localhost localdomain localhost localhost localdomain
localhost localhost localdomain localhost localhost localdomain
6.2、使用tr删除字符(tr -d)
[root@fttsaxf rough_book]# echo 1233333333333333333|tr -d 3
12
[root@fttsaxf rough_book]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 898M 0 898M 0% /dev
tmpfs tmpfs 910M 0 910M 0% /dev/shm
tmpfs tmpfs 910M 9.7M 901M 2% /run
tmpfs tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 17G 2.7G 15G 16% /
/dev/sda1 xfs 1014M 151M 864M 15% /boot
tmpfs tmpfs 182M 0 182M 0% /run/user/0
[root@fttsaxf rough_book]# df -Th|tr -d "%" # 删除所有行的"%"
文件系统 类型 容量 已用 可用 已用 挂载点
devtmpfs devtmpfs 898M 0 898M 0 /dev
tmpfs tmpfs 910M 0 910M 0 /dev/shm
tmpfs tmpfs 910M 9.7M 901M 2 /run
tmpfs tmpfs 910M 0 910M 0 /sys/fs/cgroup
/dev/mapper/centos-root xfs 17G 2.7G 15G 16 /
/dev/sda1 xfs 1014M 151M 864M 15 /boot
tmpfs tmpfs 182M 0 182M 0 /run/user/0
6.3、使用tr压缩相同的字符串(tr -s)
[root@fttsaxf rough_book]# echo 111111122222222223333333333333344|tr -s 123
12344
7、sort
7.1、sort是一个排序的命令。默认情况下,根据每一一行的首字母进行排序。
根据首字母的ASCII码值进行升序,如果首字母一样,那就再比较第二个字母,以此类推。
[root@fttsaxf rough_book]# cat test
aa
ch
h
ab
l
d
ck
[root@fttsaxf rough_book]# cat test | sort
aa
ab
ch
ck
d
h
l
[root@fttsaxf while_import_file]# cat student_info.txt | sort -k 4 # 没有"-n"就会让有些数字排序错误
cali 36 m 80
hh 21 m 9
liyu 24 m 90
ly 20 f 93
name age sex grade
[root@fttsaxf while_import_file]# cat student_info.txt | sort -k 4 -n
name age sex grade
hh 21 m 9
cali 36 m 80
liyu 24 m 90
ly 20 f 93
"""
-n 是让系统把这些数整个认定为一个数
"""
7.1.1、ASCII码与整数的相互转换
>>> ord("c")
99
>>> chr(99)
'c'
7.2、指定排序键
-k,指定哪一列为排序键
[root@fttsaxf while_import_file]# cat student_info.txt
name age sex grade
cali 36 m 80
liyu 24 m 90
ly 20 f 93
[root@fttsaxf while_import_file]# cat student_info.txt | sort -k4 # 按第四列排序
cali 36 m 80
liyu 24 m 90
ly 20 f 93
name age sex grade
[root@fttsaxf while_import_file]# cat student_info.txt | sort -k4 -n # 按整数排列
name age sex grade
cali 36 m 80
liyu 24 m 90
ly 20 f 93
[root@fttsaxf while_import_file]# cat student_info.txt | sort -k4 -rn # 逆序
ly 20 f 93
liyu 24 m 90
cali 36 m 80
name age sex grade
7.3、指定字段分隔符
-t,指定字符分割符(默认是空白(空格和tab))
# -n,将所有的数字按照数值的大小进行比较;-t,指定分隔符为,":';-k,指定第三列进行排序
[root@fttsaxf while_import_file]# cat /etc/passwd | sort -n -k 3 -t :
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
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
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
7.4、排序小练习
1.查找出ps aux命令输出的内存使用率最高的五个进程
[root@fttsaxf while_import_file]# ps aux | sort -rn -k 4| head -5
2.查找出ps aux命令输出的cpu使用率最高的十个进程,但只是显示PID、%MEM、COMMAND这个三个字段
# 注意:这里print那里,只能够用单引号,不能使用双引号
[root@fttsaxf while_import_file]# ps aux | sort -rn -k 4| head |awk '{print $2,$4,$11}'
721 1.5 /usr/bin/python2
1023 0.9 /usr/bin/python2
678 0.6 /usr/lib/polkit-1/polkitd
531 0.3 /usr/lib/systemd/systemd-udevd
1918 0.3 sshd:
1808 0.3 sshd:
1 0.3 /usr/lib/systemd/systemd
683 0.2 /usr/bin/vmtoolsd
682 0.2 /usr/bin/VGAuthService
519 0.2 /usr/sbin/lvmetad
8、uniq
删除经过排序后的数据的重复记录。通常与sort连用,sort -n tt|uniq。
[root@fttsaxf rough_book]# cat test | sort -n
aa
ch
ck
ck
d
d
[root@fttsaxf rough_book]# cat test | sort -n|uniq
aa
ch
ck
d
8.1、uniq的功能
8.1.1、统计出现的次数
-c,统计特定记录出现的次数
[root@fttsaxf rough_book]# cat test | sort -n|uniq -c
1 aa
1 ch
2 ck
2 d
8.1.2、uniq显示唯一的行
-u
[root@fttsaxf rough_book]# cat test | sort -n|uniq -u
aa
ch
8.1.3、uniq显示重复的行
-d
[root@fttsaxf rough_book]# cat test | sort -n|uniq -d
ck
d
8.2、为什么使用uniq之前,一定要先进行排序
因为uniq其实也和"tr -s"命令的执行机制差不多,都是对连续重复的行进行去重处理。所以想要达成重复的字符都排在一起,那就必须要先进行排序。
8.2.1、展示没有排序就执行uniq命令的情况
[root@fttsaxf rough_book]# cat test
aa
ch
ck
d
d
ck
[root@fttsaxf rough_book]# cat test |uniq # 这里很明显的看到了有两个"ck"
aa
ch
ck
d
ck
[root@fttsaxf rough_book]# cat test | sort -n|uniq
aa
ch
ck
d
8.3、找出文本中出现次数最多的字符
[root@fttsaxf rough_book]# cat test | sort -n|uniq -c | sort -n
1 aa
1 ch
2 d
3 ck
[root@fttsaxf rough_book]# cat test | sort -n|uniq -c | sort -rn
3 ck
2 d
1 ch
1 aa
8.3.1、查询访问本网站最多的IP地址,统计出访问量最大的3个IP地址
awk,是以空白作为分隔
9、cut
从文本文件或者文本Ⅵ提取文本列
格式:cut -选线 提取范围 文本文件
9.1、cut常见选项
9.1.1、-c
从指定提取范围中提取字符
# n:第n项
[root@fttsaxf rough_book]# echo 987654321|cut -c 2
8
# n-:第n项到行尾
[root@fttsaxf rough_book]# echo 987654321|cut -c 2-
87654321
# -m:行首到第m项
[root@fttsaxf rough_book]# echo 987654321|cut -c -2
98
# n-m:第n项到第m项
[root@fttsaxf rough_book]# echo 987654321|cut -c 2-8
8765432
# n,m:第n项和第m项
[root@fttsaxf rough_book]# echo 987654321|cut -c 2,8
82
9.1.2、-f
指定默认的分隔符是tab
-f, --fields=LIST fileds字段
select only these fields;
[root@fttsaxf rough_book]# w|cut -f 1
13:04:57 up 2:17, 3 users, load average: 0.02, 0.02, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 10:45 2:19m 0.02s 0.02s -bash
root pts/0 192.168.29.1 10:45 2:19m 0.01s 0.01s -bash
root pts/1 192.168.29.1 11:41 1.00s 0.14s 0.00s w
[root@fttsaxf rough_book]# w|cut -d " " -f 1 # 指定空格为分隔符
USER
root
root
root
9.1.3、使用cut的时候,字段之间有多个分隔符的情况
# 在以下情况下我们要节选出这个"4"来
[root@fttsaxf rough_book]# echo 1#2#3##4|cut -d "#" -f 1 # 指定分隔符为"#"
1
[root@fttsaxf rough_book]# echo 1#2#3##4|cut -d "#" -f 4
[root@fttsaxf rough_book]# echo 1#2#3##4|cut -d "#" -f 5 # 只能在第五个字段中选出"4"
4
# 下面这种情况截取出第一二节字段
[root@fttsaxf rough_book]# w
13:11:46 up 2:24, 3 users, load average: 0.02, 0.03, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 10:45 2:26m 0.02s 0.02s -bash
root pts/0 192.168.29.1 10:45 2:26m 0.01s 0.01s -bash
root pts/1 192.168.29.1 11:41 2.00s 0.17s 0.00s w
[root@fttsaxf rough_book]# w|cut -d " " -f 1,2 # 由此可见直接使用cut并不能够截取的出来
13:11:48
USER
root
root
root
如何解决这个问题?
我们可以使用"tr"
# 这样就在第四个字段中把"4"截取出来了
[root@fttsaxf rough_book]# echo 1#2#3##4|tr -s "#"|cut -d "#" -f 4
4
# 这样就把第一二节字段截取出来了
[root@fttsaxf rough_book]# w|tr -s " "|cut -d " " -f 1,2
13:13:14
USER TTY
root tty1
root pts/0
root pts/1
9.2、 awk与cut的功能比较与区别
awk的功能比cut的功能更加的强大和完善。awk的默认分隔符是空白,cut的默认分隔符是tab
# 查找出UID大于1000的用户,输出这个用户的名字和UID以及shell。这个题目里,使用awk就十分简单
"""
[root@fttsaxf rough_book]# id fdd
uid=1003(fdd) gid=1003(fdd) 组=1003(fdd)
uid是用户的id号,也可以叫做标识符
gid组的id。比如,你属于汉族的或者其他民族的
"""
[root@fttsaxf rough_book]# cat /etc/passwd|awk -F ":" '$3>1000 {print $1,$3,$NF}'
10、文本处理小练习
以下每一行都是一个答案
第一题:
[root@fttsaxf rough_book]# ll -R /root/|awk '{print $5}'|sort -n
[root@fttsaxf rough_book]# ll -R /root|tr -s " "|cut -d " " -f 5 |sort -n
[root@fttsaxf rough_book]# ll -R /boot|sort -n -k 5|awk '{print $5,$9}'
第二题:
[root@fttsaxf rough_book]# cat /etc/passwd|tr -s ":"|cut -d ":" -f 7|sort -n|uniq -c|sort -nr
[root@fttsaxf rough_book]# cat /etc/passwd|awk -F ":" '{print $7}'|sort |uniq -c| sort -rn
[root@fttsaxf rough_book]# cat /etc/passwd|awk -F: '{print $NF}'|sort |uniq -c|sort -rn
18 /sbin/nologin
15 /bin/bash
1 /sbin/shutdown
1 /sbin/halt
1 /bin/sync
# 看到倒数第二列
[root@fttsaxf rough_book]# cat /etc/passwd|awk -F: '{print $NF,$(NF-1)}'|sort |uniq -c|sort -rn
第三题:
[root@fttsaxf rough_book]# df -Th|tr -s " "|cut -d " " -f 1,2,6|tail -n +2|sort -n
[root@fttsaxf rough_book]# df -Th|awk '{print $1,$2,$6}'
文件系统 类型 已用%
devtmpfs devtmpfs 0%
tmpfs tmpfs 0%
tmpfs tmpfs 2%
tmpfs tmpfs 0%
/dev/mapper/centos-root xfs 16%
/dev/sda1 xfs 15%
tmpfs tmpfs 0%
第四题:
[root@fttsaxf rough_book]# cat /etc/passwd|tr ":" "\n"|grep sbin|wc -l
24
# 因为有些行里有两个"sbin",所以可以把":"换成"\n",然后"sbin"会每一个分布一行
[root@fttsaxf rough_book]# cat /etc/passwd|tr ":" "\n"|grep -o sbin|wc -l
24
第五题:
[root@fttsaxf rough_book]# ps aux|sort -rn -k 4|head -5|awk '{print $2,$11}'
1890 /usr/bin/python2
1060 /usr/bin/python2
682 /usr/lib/polkit-1/polkitd
529 /usr/lib/systemd/systemd-udevd
1698 sshd:
第六题:
[root@fttsaxf rough_book]# ps aux|sort -rn -k 4|head -5|awk '{print $2,$11}'
1890 /usr/bin/python2
1060 /usr/bin/python2
682 /usr/lib/polkit-1/polkitd
529 /usr/lib/systemd/systemd-udevd
1698 sshd:
第七题:
[root@fttsaxf rough_book]# ip add|grep "192"|awk '{print $2}'
192.168.29.128/24
第八题:
10.1、练习总结
10.1.1、awk的部分使用方法
-F "x",指定"x"为分隔符。awk的默认分隔符是空白(空格和tab)
NF是awk里的内置的一个变量,代表一行里有多少个字段(number of fileds) 。$NF,引用NF变量的值,表示最后一列。倒数第二列为$(NF-1)
10.1.2、grep的部分用法
-o, --only-matching
Print only the matched (non-empty) parts of a matching line, with each such part
on a separate output line.
只输出匹配的内容,不匹配不显示。且匹配的内容,单独显示为一行