当前位置:   article > 正文

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

重定向_read

目录 

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 + 参数

  1. [root@fttsaxf ~]# read num
  2. 1
  3. [root@fttsaxf ~]# echo $num
  4. 1

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

  1. [root@fttsaxf while_import_file]# read -p "请输入用户名和密码:" u_name u_pwd
  2. 请输入用户名和密码:feng 123456
  3. [root@fttsaxf while_import_file]# echo $u_name
  4. feng
  5. [root@fttsaxf while_import_file]# echo $u_pwd
  6. 123456

1.2、位置变量

$1、$2......

1.2.1、位置变量传参的形式

  1. [root@fttsaxf script]# cat position.sh
  2. #!/bin/bash
  3. echo "第一个位置变量 $1"
  4. echo "第二个位置变量 $2"
  5. echo "第三个位置变量 $3"
  6. echo "所有位置变量的内容:$*"
  7. echo "位置变量的数量:$#"
  8. echo "脚本名字是:$0"
  9. [root@fttsaxf script]# bash position.sh fan feng love
  10. 第一个位置变量 fan
  11. 第二个位置变量 feng
  12. 第三个位置变量 love
  13. 所有位置变量的内容:fan feng love
  14. 位置变量的数量:3
  15. 脚本名字是:position.sh

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

  1. [root@fttsaxf script]# cat casev2.sh
  2. #!/bin/bash
  3. case $1 in
  4. start)
  5. echo "启动程序"
  6. ;;
  7. stop)
  8. echo "关闭程序"
  9. ;;
  10. restart|reload)
  11. echo "重启程序"
  12. ;;
  13. *)
  14. echo "请检查输入是否正确"
  15. ;;
  16. esac
  17. [root@fttsaxf script]# bash casev2.sh start
  18. 启动程序
  19. [root@fttsaxf script]# bash casev2.sh stop
  20. 关闭程序
  21. [root@fttsaxf script]# bash casev2.sh reload
  22. 重启程序
  23. [root@fttsaxf script]# bash casev2.sh 1235
  24. 请检查输入是否正确

1.3、python的sys.argv用法

  1. [root@fttsaxf script]# cat position.py
  2. import sys
  3. # 输出所有的位置变量
  4. # sys.argv代表所有的位置变量 --》相当于shell里的$*
  5. print(sys.argv)
  6. print("#" * 50)
  7. # 使用for循环,一个一个的输出位置变量
  8. for i in sys.argv:
  9. print(i)
  10. [root@fttsaxf script]# python3 position.py feng liu shi jin
  11. ['position.py', 'feng', 'liu', 'shi', 'jin']
  12. ##################################################
  13. position.py
  14. feng
  15. liu
  16. shi
  17. jin

2、while

while无限循环的两种格式:

1、while :    注意:"while" 和 ":" 之间有一个空格
2、while true

2.1、while的各种用法

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

  1. [root@fttsaxf while_import_file]# cat student_info.txt
  2. name age sex grade
  3. cali 36 m 80
  4. liyu 24 m 90
  5. ly 20 f 93
  6. [root@fttsaxf while_import_file]# cat while_import_file.sh
  7. #!/bin/bash
  8. # 方法一:导入
  9. while read u_name u_age u_sex u_grade
  10. do
  11. echo -e "名字是$u_name \t性别是$u_sex \t年龄为$u_age \t分数是$u_grade"
  12. done < student_info.txt
  13. echo "#####################"
  14. # 方法二:
  15. cat student_info.txt | while read u_name u_age u_sex u_grade
  16. do
  17. echo -e "名字是$u_name \t性别是$u_sex \t年龄为$u_age \t分数是$u_grade"
  18. done
  19. [root@fttsaxf while_import_file]# bash while_import_file.sh
  20. 名字是name 性别是sex 年龄为age 分数是grade
  21. 名字是cali 性别是m 年龄为36 分数是80
  22. 名字是liyu 性别是m 年龄为24 分数是90
  23. 名字是ly 性别是f 年龄为20 分数是93
  24. #####################
  25. 名字是name 性别是sex 年龄为age 分数是grade
  26. 名字是cali 性别是m 年龄为36 分数是80
  27. 名字是liyu 性别是m 年龄为24 分数是90
  28. 名字是ly 性别是f 年龄为20 分数是93

3、字符串的比较

[[]],双中括号。

  1. [root@fttsaxf rough_book]# cat if.sh
  2. read -p "请输入你的名字:" name
  3. if [[ $name == "root" ]] # 输入的判断条件两边必须要有空格
  4. then
  5. echo "welcome to login"
  6. else
  7. echo "请输入正确的用户名"
  8. fi
  9. [root@fttsaxf rough_book]# bash if.sh
  10. 请输入你的名字:root
  11. welcome to login

3.1、数值比较

(()),双圆括号

  1. [root@fttsaxf while_import_file]# cat test
  2. #!/bin/bash
  3. if (( $1 > $2))
  4. then
  5. echo "第一个数大于第二个数"
  6. else
  7. echo "第一个数小于第二个数"
  8. fi
  9. [root@fttsaxf while_import_file]# bash test 1 2
  10. 第一个数小于第二个数

4、管道符号

定义:连接左右两个命令,将左侧的命令的标准输出,作为右侧命令的标准输入
格式:cmd1 | cmd2...

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

默认情况下,管道会把前边正确的输出作为后边命令的输入

  1. [root@fttsaxf for_while.sh]# cat while.sh | grep "if"
  2. if ((k==3));then #;可以进行命令连接
  3. if ((k==8));then
  4. [root@fttsaxf for_while.sh]# cat while.shdfas | grep "if"
  5. cat: while.shdfas: 没有那个文件或目录

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

那怎么才能使错误的输出也能够作为后便命令的输入

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

进程和进程之间通信的方式:1、管道 pipe;2、socket文件

4.3.1、通信方法之——管道

  1. [root@fttsaxf for_while.sh]# find / -type "p" # 在根目录下查找文件类型为管道的文件
  2. [root@fttsaxf for_while.sh]# ll /run/dmeventd-client
  3. prw-------. 1 root root 0 2月 12 10:59 /run/dmeventd-client
  4. '''
  5. - 表示普通的文本文件
  6. d 表示目录 directory
  7. l 表示链接文件 link
  8. p 表示管道文件 --》 存放在内存中
  9. c 表示字符设备文件 character
  10. b 表示块设备文件 block
  11. s 表示socket文件 --》 存放在磁盘中
  12. '''

图片说明:这个管道文件也是在内存中的,这样画只是为了方便理解。

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

 

4.3.3、查看挂载的系统

[root@fttsaxf for_while.sh]# df -a

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

  1. [root@fttsaxf lucky_draw]# df -Th
  2. 文件系统 类型 容量 已用 可用 已用% 挂载点
  3. devtmpfs devtmpfs 898M 0 898M 0% /dev
  4. tmpfs tmpfs 910M 0 910M 0% /dev/shm
  5. tmpfs tmpfs 910M 9.7M 901M 2% /run
  6. tmpfs tmpfs 910M 0 910M 0% /sys/fs/cgroup
  7. /dev/mapper/centos-root xfs 17G 2.7G 15G 16% /
  8. /dev/sda1 xfs 1014M 151M 864M 15% /boot
  9. tmpfs tmpfs 182M 0 182M 0% /run/user/0

4.4、文本编辑3种方法

1、grep --》过滤
2、awk --》截取行里的字段,一个字段代表一列
3、sed --》替换

  1. [root@fttsaxf while_import_file]# cat student_info.txt
  2. name age sex grade
  3. cali 36 m 80
  4. liyu 24 m 90
  5. ly 20 f 93
  6. [root@fttsaxf while_import_file]# cat student_info.txt | awk '{print $4}'
  7. grade
  8. 80
  9. 90
  10. 93
  11. '''
  12. awk 是截取命令
  13. '{}' 是固定的语法
  14. print 是awk里的命令,用来输出内容
  15. $4 表示第4个字段
  16. awk 默认的字段和字段之间的分隔符是空白(空格、tab、回车)
  17. '''
  18. [root@fttsaxf while_import_file]# cat student_info.txt | awk '{print $0$4}'
  19. name age sex gradegrade
  20. cali 36 m 8080
  21. liyu 24 m 9090
  22. ly 20 f 9393
  23. [root@fttsaxf while_import_file]# cat student_info.txt | awk '{print $0,$4}'
  24. name age sex grade grade
  25. cali 36 m 80 80
  26. liyu 24 m 90 90
  27. ly 20 f 93 93
  28. # ','是输出的时候使用一个空格作为分隔符

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

  1. [root@fttsaxf while_import_file]# cat test
  2. #!/bin/bash
  3. if (( $1 > $2))
  4. then
  5. echo "第一个数大于第二个数"
  6. else
  7. echo "第一个数小于第二个数"
  8. fi
  9. [root@fttsaxf while_import_file]# cat <test ;cat student_info.txt
  10. #!/bin/bash
  11. if (( $1 > $2))
  12. then
  13. echo "第一个数大于第二个数"
  14. else
  15. echo "第一个数小于第二个数"
  16. fi
  17. name age sex grade
  18. cali 36 m 80
  19. liyu 24 m 90
  20. ly 20 f 93

4.5.1、;

命令连接符号,可以将多个命令写到一行。

cmd1;cmd2;cmd3 先执行cmd1再执行cmd2最后执行cmd3,不管前面的命令是否执行成功,都会执行

  1. [root@fttsaxf while_import_file]# cd gjasl;echo love;cd sig
  2. -bash: cd: gjasl: 没有那个文件或目录
  3. love
  4. -bash: cd: sig: 没有那个文件或目录

4.5.2、&&和||

cmd1 && cmd2 如果cmd1执行成功,就执行cmd2,如果执行不成功不执行cmd2
cmd1 || cmd2 如果cmd1不执行成功,就执行cmd2,如果执行成功不执行cmd2
cmd1 && cmd2 || cmd3 如果cmd1执行成功,就执行cmd2,如果执行不成功就执行cmd3

  1. [root@fttsaxf while_import_file]# mkdir love && echo yes || echo no
  2. yes
  3. [root@fttsaxf while_import_file]# mkdir love && echo yes || echo no
  4. mkdir: 无法创建目录"love": 文件已存在
  5. 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()

  1. >>> os.path.exists("/backup")
  2. False
  3. >>> os.mkdir("/backup")
  4. >>> os.path.exists("/backup")
  5. True
  1. [root@fttsaxf rough_book]# cat dir.py
  2. #!/usr/bin/python3
  3. import os
  4. if os.path.exists("/backup"):
  5. print("/backup is exists")
  6. else:
  7. os.mkdir("/backup")
  8. print("/backup create ok")

3.统计整个linu根目录的大小,不要显示错误的信息

  1. [root@fttsaxf while_import_file]# du -sh / 2>/dev/null
  2. 2.8G /

5、xargs

有些命令对管道符号的支持不是很好

5.1、xargs与管道符号的比较

管道:将前边命令的输出送给后边的命令使用
xargs:将前边命令的输出送给后边命令作为参数使用

-i,前边一条命令的n个输出,逐个传入后面的命令去执行,在{}处执行

注意:在使用xargs的时候不能够使用命令的别名(alias)

  1. [root@fttsaxf rough_book]# which mkdir | ls -l # 这里显示的是rough_book里的文件信息
  2. 总用量 8
  3. -rw-r--r--. 1 root root 144 2月 12 20:32 dir.py
  4. -rw-r--r--. 1 root root 20 2月 9 11:25 new
  5. [root@fttsaxf rough_book]# ll /usr/bin/mkdir
  6. -rwxr-xr-x. 1 root root 79768 8月 20 2019 /usr/bin/mkdir
  7. [root@fttsaxf rough_book]# which mkdir | xargs ls -l # xargs 将前边的命令的结果作为后边命令的参数
  8. -rwxr-xr-x. 1 root root 79768 8月 20 2019 /usr/bin/mkdir
  9. #xargs还是需要依赖管道,只是将前面的命令的输出送给后面的命令做参数使用而已,更加的精准了。让一些不支持管道的命令,也可以使用管道了。
  10. [root@fttsaxf rough_book]# find ./ -maxdepth 1 -name "test" -type f | xargs -i cp {} /tmp

6、tr

  1. [root@fttsaxf lucky_draw]# echo 1234511253 | tr 123 abc # 不要把123认为是一个整体,它就是单个字符对应替换
  2. abc45aab5c
  3. [root@fttsaxf rough_book]# cat test
  4. 1122334411
  5. [root@fttsaxf rough_book]# tr "11" "aa" <test
  6. aa223344aa
  7. [root@fttsaxf rough_book]# cat test
  8. 1122334411
  9. """
  10. 缺陷:需要用管道符号或者"<"给tr传递参数,且若是对文本进行替换,只是显示替换的效果,并不会对其进行修改
  11. """

6.1、属于linux的通配符含义

  1. [root@fttsaxf rough_book]# cat /etc/hosts
  2. 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
  3. ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
  4. [root@fttsaxf rough_book]# cat /etc/hosts|tr "[a-z]" "[A-Z]"
  5. 127.0.0.1 LOCALHOST LOCALHOST.LOCALDOMAIN LOCALHOST4 LOCALHOST4.LOCALDOMAIN4
  6. ::1 LOCALHOST LOCALHOST.LOCALDOMAIN LOCALHOST6 LOCALHOST6.LOCALDOMAIN6
  7. [root@fttsaxf rough_book]# cat /etc/hosts|tr "[0-9]" " "
  8. . . . localhost localhost.localdomain localhost localhost .localdomain
  9. :: localhost localhost.localdomain localhost localhost .localdomain
  10. [root@fttsaxf rough_book]# cat /etc/hosts|tr "[0-9.]" " " # 删除0-9和"."
  11. localhost localhost localdomain localhost localhost localdomain
  12. :: localhost localhost localdomain localhost localhost localdomain
  13. [root@fttsaxf rough_book]# cat /etc/hosts|tr "[0-9.:]" " "
  14. localhost localhost localdomain localhost localhost localdomain
  15. localhost localhost localdomain localhost localhost localdomain

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

  1. [root@fttsaxf rough_book]# echo 1233333333333333333|tr -d 3
  2. 12
  3. [root@fttsaxf rough_book]# df -Th
  4. 文件系统 类型 容量 已用 可用 已用% 挂载点
  5. devtmpfs devtmpfs 898M 0 898M 0% /dev
  6. tmpfs tmpfs 910M 0 910M 0% /dev/shm
  7. tmpfs tmpfs 910M 9.7M 901M 2% /run
  8. tmpfs tmpfs 910M 0 910M 0% /sys/fs/cgroup
  9. /dev/mapper/centos-root xfs 17G 2.7G 15G 16% /
  10. /dev/sda1 xfs 1014M 151M 864M 15% /boot
  11. tmpfs tmpfs 182M 0 182M 0% /run/user/0
  12. [root@fttsaxf rough_book]# df -Th|tr -d "%" # 删除所有行的"%"
  13. 文件系统 类型 容量 已用 可用 已用 挂载点
  14. devtmpfs devtmpfs 898M 0 898M 0 /dev
  15. tmpfs tmpfs 910M 0 910M 0 /dev/shm
  16. tmpfs tmpfs 910M 9.7M 901M 2 /run
  17. tmpfs tmpfs 910M 0 910M 0 /sys/fs/cgroup
  18. /dev/mapper/centos-root xfs 17G 2.7G 15G 16 /
  19. /dev/sda1 xfs 1014M 151M 864M 15 /boot
  20. tmpfs tmpfs 182M 0 182M 0 /run/user/0

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

  1. [root@fttsaxf rough_book]# echo 111111122222222223333333333333344|tr -s 123
  2. 12344

7、sort

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

根据首字母的ASCII码值进行升序,如果首字母一样,那就再比较第二个字母,以此类推。

  1. [root@fttsaxf rough_book]# cat test
  2. aa
  3. ch
  4. h
  5. ab
  6. l
  7. d
  8. ck
  9. [root@fttsaxf rough_book]# cat test | sort
  10. aa
  11. ab
  12. ch
  13. ck
  14. d
  15. h
  16. l
  17. [root@fttsaxf while_import_file]# cat student_info.txt | sort -k 4 # 没有"-n"就会让有些数字排序错误
  18. cali 36 m 80
  19. hh 21 m 9
  20. liyu 24 m 90
  21. ly 20 f 93
  22. name age sex grade
  23. [root@fttsaxf while_import_file]# cat student_info.txt | sort -k 4 -n
  24. name age sex grade
  25. hh 21 m 9
  26. cali 36 m 80
  27. liyu 24 m 90
  28. ly 20 f 93
  29. """
  30. -n 是让系统把这些数整个认定为一个数
  31. """

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

  1. >>> ord("c")
  2. 99
  3. >>> chr(99)
  4. 'c'

7.2、指定排序键

-k,指定哪一列为排序键

  1. [root@fttsaxf while_import_file]# cat student_info.txt
  2. name age sex grade
  3. cali 36 m 80
  4. liyu 24 m 90
  5. ly 20 f 93
  6. [root@fttsaxf while_import_file]# cat student_info.txt | sort -k4 # 按第四列排序
  7. cali 36 m 80
  8. liyu 24 m 90
  9. ly 20 f 93
  10. name age sex grade
  11. [root@fttsaxf while_import_file]# cat student_info.txt | sort -k4 -n # 按整数排列
  12. name age sex grade
  13. cali 36 m 80
  14. liyu 24 m 90
  15. ly 20 f 93
  16. [root@fttsaxf while_import_file]# cat student_info.txt | sort -k4 -rn # 逆序
  17. ly 20 f 93
  18. liyu 24 m 90
  19. cali 36 m 80
  20. name age sex grade

7.3、指定字段分隔符

-t,指定字符分割符(默认是空白(空格和tab))

  1. # -n,将所有的数字按照数值的大小进行比较;-t,指定分隔符为,":';-k,指定第三列进行排序
  2. [root@fttsaxf while_import_file]# cat /etc/passwd | sort -n -k 3 -t :
  3. root:x:0:0:root:/root:/bin/bash
  4. bin:x:1:1:bin:/bin:/sbin/nologin
  5. daemon:x:2:2:daemon:/sbin:/sbin/nologin
  6. adm:x:3:4:adm:/var/adm:/sbin/nologin
  7. lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  8. sync:x:5:0:sync:/sbin:/bin/sync
  9. shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
  10. halt:x:7:0:halt:/sbin:/sbin/halt
  11. mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
  12. operator:x:11:0:operator:/root:/sbin/nologin
  13. 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这个三个字段

  1. # 注意:这里print那里,只能够用单引号,不能使用双引号
  2. [root@fttsaxf while_import_file]# ps aux | sort -rn -k 4| head |awk '{print $2,$4,$11}'
  3. 721 1.5 /usr/bin/python2
  4. 1023 0.9 /usr/bin/python2
  5. 678 0.6 /usr/lib/polkit-1/polkitd
  6. 531 0.3 /usr/lib/systemd/systemd-udevd
  7. 1918 0.3 sshd:
  8. 1808 0.3 sshd:
  9. 1 0.3 /usr/lib/systemd/systemd
  10. 683 0.2 /usr/bin/vmtoolsd
  11. 682 0.2 /usr/bin/VGAuthService
  12. 519 0.2 /usr/sbin/lvmetad

8、uniq

删除经过排序后的数据的重复记录。通常与sort连用,sort -n |uniq。

  1. [root@fttsaxf rough_book]# cat test | sort -n
  2. aa
  3. ch
  4. ck
  5. ck
  6. d
  7. d
  8. [root@fttsaxf rough_book]# cat test | sort -n|uniq
  9. aa
  10. ch
  11. ck
  12. d

8.1、uniq的功能

8.1.1、统计出现的次数 

-c,统计特定记录出现的次数

  1. [root@fttsaxf rough_book]# cat test | sort -n|uniq -c
  2. 1 aa
  3. 1 ch
  4. 2 ck
  5. 2 d

8.1.2、uniq显示唯一的行

-u

  1. [root@fttsaxf rough_book]# cat test | sort -n|uniq -u
  2. aa
  3. ch

8.1.3、uniq显示重复的行

-d

  1. [root@fttsaxf rough_book]# cat test | sort -n|uniq -d
  2. ck
  3. d

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

因为uniq其实也和"tr -s"命令的执行机制差不多,都是对连续重复的行进行去重处理。所以想要达成重复的字符都排在一起,那就必须要先进行排序。

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

  1. [root@fttsaxf rough_book]# cat test
  2. aa
  3. ch
  4. ck
  5. d
  6. d
  7. ck
  8. [root@fttsaxf rough_book]# cat test |uniq # 这里很明显的看到了有两个"ck"
  9. aa
  10. ch
  11. ck
  12. d
  13. ck
  14. [root@fttsaxf rough_book]# cat test | sort -n|uniq
  15. aa
  16. ch
  17. ck
  18. d

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

  1. [root@fttsaxf rough_book]# cat test | sort -n|uniq -c | sort -n
  2. 1 aa
  3. 1 ch
  4. 2 d
  5. 3 ck
  6. [root@fttsaxf rough_book]# cat test | sort -n|uniq -c | sort -rn
  7. 3 ck
  8. 2 d
  9. 1 ch
  10. 1 aa

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

 awk,是以空白作为分隔 

9、cut

从文本文件或者文本提取文本列

格式:cut -选线 提取范围 文本文件

9.1、cut常见选项

9.1.1、cut -c

从指定提取范围中提取字符

  1. # n:第n项
  2. [root@fttsaxf rough_book]# echo 987654321|cut -c 2
  3. 8
  4. # n-:第n项到行尾
  5. [root@fttsaxf rough_book]# echo 987654321|cut -c 2-
  6. 87654321
  7. # -m:行首到第m项
  8. [root@fttsaxf rough_book]# echo 987654321|cut -c -2
  9. 98
  10. # n-m:第n项到第m项
  11. [root@fttsaxf rough_book]# echo 987654321|cut -c 2-8
  12. 8765432
  13. # n,m:第n项和第m项
  14. [root@fttsaxf rough_book]# echo 987654321|cut -c 2,8
  15. 82

9.1.2、cut -f

指定默认的分隔符是tab

 -f, --fields=LIST    fileds字段
              select only these fields;

  1. [root@fttsaxf rough_book]# w|cut -f 1 # 这里跟直接"w"没什么变化
  2. 13:04:57 up 2:17, 3 users, load average: 0.02, 0.02, 0.05
  3. USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
  4. root tty1 10:45 2:19m 0.02s 0.02s -bash
  5. root pts/0 192.168.29.1 10:45 2:19m 0.01s 0.01s -bash
  6. root pts/1 192.168.29.1 11:41 1.00s 0.14s 0.00s w
  7. [root@fttsaxf rough_book]# w|cut -d " " -f 1 # 指定空格为分隔符
  8. USER
  9. root
  10. root
  11. root

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

  1. # 在以下情况下我们要节选出这个"4"来
  2. [root@fttsaxf rough_book]# echo 1#2#3##4|cut -d "#" -f 1 # 指定分隔符为"#"
  3. 1
  4. [root@fttsaxf rough_book]# echo 1#2#3##4|cut -d "#" -f 4
  5. [root@fttsaxf rough_book]# echo 1#2#3##4|cut -d "#" -f 5 # 只能在第五个字段中选出"4"
  6. 4
  7. # 下面这种情况截取出第一二节字段
  8. [root@fttsaxf rough_book]# w
  9. 13:11:46 up 2:24, 3 users, load average: 0.02, 0.03, 0.05
  10. USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
  11. root tty1 10:45 2:26m 0.02s 0.02s -bash
  12. root pts/0 192.168.29.1 10:45 2:26m 0.01s 0.01s -bash
  13. root pts/1 192.168.29.1 11:41 2.00s 0.17s 0.00s w
  14. [root@fttsaxf rough_book]# w|cut -d " " -f 1,2 # 由此可见直接使用cut并不能够截取的出来
  15. 13:11:48
  16. USER
  17. root
  18. root
  19. root

如何解决这个问题?

我们可以使用"tr",使用之后会把多个空格或者tab或者#压缩成一个,这样就能成功截取出来对应的字段了

  1. # 这样就在第四个字段中把"4"截取出来了
  2. [root@fttsaxf rough_book]# echo 1#2#3##4|tr -s "#"|cut -d "#" -f 4
  3. 4
  4. # 这样就把第一二节字段截取出来了
  5. [root@fttsaxf rough_book]# w|tr -s " "|cut -d " " -f 1,2
  6. 13:13:14
  7. USER TTY
  8. root tty1
  9. root pts/0
  10. root pts/1

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

awk的功能比cut的功能更加的强大和完善。awk的默认分隔符是空白,cut的默认分隔符是tab

  1. # 查找出UID大于1000的用户,输出这个用户的名字和UID以及shell。这个题目里,使用awk就十分简单
  2. """
  3. [root@fttsaxf rough_book]# id fdd
  4. uid=1003(fdd) gid=1003(fdd) 组=1003(fdd)
  5. uid是用户的id号,也可以叫做标识符
  6. gid组的id。比如,你属于汉族的或者其他民族的
  7. """
  8. [root@fttsaxf rough_book]# cat /etc/passwd|awk -F ":" '$3>1000 {print $1,$3,$NF}'

10、文本处理小练习

以下每一行都是一个答案

 第一题:

"ll -R",会递归的显示出要显示的目录下的所有文件夹和文件、子文件和文件夹

  1. [root@fttsaxf rough_book]# ll -R /root/|awk '{print $5}'|sort -n
  2. [root@fttsaxf rough_book]# ll -R /root|tr -s " "|cut -d " " -f 5 |sort -n
  3. [root@fttsaxf rough_book]# ll -R /boot|sort -n -k 5|awk '{print $5,$9}'

第二题:

"$NF"表示最后一个字段

  1. [root@fttsaxf rough_book]# cat /etc/passwd|tr -s ":"|cut -d ":" -f 7|sort -n|uniq -c|sort -nr
  2. [root@fttsaxf rough_book]# cat /etc/passwd|awk -F ":" '{print $7}'|sort |uniq -c| sort -rn
  3. [root@fttsaxf rough_book]# cat /etc/passwd|awk -F: '{print $NF}'|sort |uniq -c|sort -rn
  4. 18 /sbin/nologin
  5. 15 /bin/bash
  6. 1 /sbin/shutdown
  7. 1 /sbin/halt
  8. 1 /bin/sync
  9. # 看到倒数第二列
  10. [root@fttsaxf rough_book]# cat /etc/passwd|awk -F: '{print $NF,$(NF-1)}'|sort |uniq -c|sort -rn

第三题:

  1. [root@fttsaxf rough_book]# df -Th|tr -s " "|cut -d " " -f 1,2,6|tail -n +2|sort -n
  2. [root@fttsaxf rough_book]# df -Th|awk '{print $1,$2,$6}'
  3. 文件系统 类型 已用%
  4. devtmpfs devtmpfs 0%
  5. tmpfs tmpfs 0%
  6. tmpfs tmpfs 2%
  7. tmpfs tmpfs 0%
  8. /dev/mapper/centos-root xfs 16%
  9. /dev/sda1 xfs 15%
  10. tmpfs tmpfs 0%

 第四题:

  1. [root@fttsaxf rough_book]# cat /etc/passwd|tr ":" "\n"|grep sbin|wc -l
  2. 24
  3. # 因为有些行里有两个"sbin",所以可以把":"换成"\n",然后"sbin"会每一个分布一行
  4. [root@fttsaxf rough_book]# cat /etc/passwd|tr ":" "\n"|grep -o sbin|wc -l
  5. 24
  6. # 只打印匹配行中匹配的(非空的)部分,每个这样的部分在一个单独的输出行中

 第五题:

  1. [root@fttsaxf rough_book]# ps aux|sort -rn -k 4|head -5|awk '{print $2,$11}'
  2. 1890 /usr/bin/python2
  3. 1060 /usr/bin/python2
  4. 682 /usr/lib/polkit-1/polkitd
  5. 529 /usr/lib/systemd/systemd-udevd
  6. 1698 sshd:

 第六题:

  1. [root@fttsaxf rough_book]# ps aux|sort -rn -k 4|head -5|awk '{print $2,$11}'
  2. 1890 /usr/bin/python2
  3. 1060 /usr/bin/python2
  4. 682 /usr/lib/polkit-1/polkitd
  5. 529 /usr/lib/systemd/systemd-udevd
  6. 1698 sshd:

第七题:

  1. [root@fttsaxf rough_book]# ip add|grep "192"|awk '{print $2}'
  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.

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/211974
推荐阅读
相关标签
  

闽ICP备14008679号