六、linux学习——重定向和文本处理的命令(read、位置变量、[[]]、(())、管道符号、进程之间的通信方法、xargs、uniq、tr、cut)—2

202 阅读10分钟

目录

1、如何往脚本里传递参数

1.1、read + 参数

1.1.1、read可以同时接受用户输入的多个值,赋值给多个变量

1.2、位置变量

1.2.1、位置变量传参的形式

1.2.2、位置变量关于字符串的匹配

1.3、python的sys.argv用法

2、while

2.1、while的各种用法

2.2、while导入文件内容的功能

3、字符串的比较

3.1、数值比较

4、管道符号

4.1、默认情况下管道符号只会传递正确的输出

4.2、怎么才能使错误的输出也被传递呢(2>&1)

4.3、默认情况下,进程和进程之间是不能随便访问的

4.3.1、通信方法之——管道

4.3.2、通信方法之——socket文件

4.3.3、查看挂载的系统

4.3.4、查看linux里的分区的使用情况

4.4、文本编辑3种方法

4.5、同时显现出两个文件的内容

4.5.1、;

4.5.2、&&和||

4.5.3、小练习(&&和||)

5、xargs

5.1、xargs与管道符号的比较

6、tr

6.1、属于linux的通配符含义

6.2、使用tr删除字符(tr -d)

6.3、使用tr压缩相同的字符串(tr -s)

7、sort

7.1、sort是一个排序的命令。默认情况下,根据每一一行的首字母进行排序。

7.1.1、ASCII码与整数的相互转换

7.2、指定排序键

7.3、指定字段分隔符

7.4、排序小练习

8、uniq

8.1、uniq的功能

8.1.1、统计出现的次数 

8.1.2、uniq显示唯一的行

8.1.3、uniq显示重复的行

8.2、为什么使用uniq之前,一定要先进行排序

8.2.1、展示没有排序就执行uniq命令的情况

8.3、找出文本中出现次数最多的字符

8.3.1、查询访问本网站最多的IP地址,统计出访问量最大的3个IP地址

9、cut

9.1、cut常见选项

9.1.1、-c

9.1.2、-f

9.1.3、使用cut的时候,字段之间有多个分隔符的情况

9.2、 awk与cut的功能比较与区别

10、文本处理小练习

10.1、练习总结

10.1.1、awk的部分使用方法

10.1.2、grep的部分用法


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.

只输出匹配的内容,不匹配不显示。且匹配的内容,单独显示为一行