zl程序教程

您现在的位置是:首页 >  系统

当前栏目

Linux - tr命令,sort命令,uniq命令,cut命令

Linux命令 Sort cut tr uniq
2023-09-11 14:17:06 时间

目录

1.  tr命令

1.1  示例:用重定向与tr结合替换字符

1.2  linux里面的通配符

1.3  使用tr删除字符串

1.4  示例:删除所有的%

1.5  使用tr压缩字符

1.5.1  示例:将df中连续的空格压缩成一个空格

2.  sort命令

2.1  -n 按整数进行排序

2.2  -k 按指定列进行排序

2.3   -r 递减排序

2.4  -t 指定分隔符 (默认是空白)

3.  uniq 命令

-c 统计重复的数据

3.1  示例:

4.  cut 命令

4.1  -c 从指定提取范围中提取字符

4.2  -f 从指定提取范围中提取字符段

4.2.1   示例:-c提取字符,下标从1开始

练习


1.  tr命令

字符转换工具

tr - translate or delete characters

只能对stdin操作,不能直接对文件操作

使用tr转换字符

tr set1 set2

用set2中的字符替换set1中的字符

tr命令不支持直接操作,要想办法将参数信息传递给它

需要使用管道或者<给tr传递参数

例:将PATH变量中所有的:替换成\n

 #####################################

1.1  示例:用重定向与tr结合替换字符

[root@localhost script]# cat 111.txt

aaaa

bbbb

cccc

dddd

[root@localhost script]# tr a A

AAAA

bbbb

cccc

dddd

#####################################

1.2  linux里面的通配符

*代表任意个任意字符 --》n个任意字符

?代表一个任意的字符

[集合] --》每次都只是取其中的一个

[0-9] : 代表0,1,2,---9 每次只取一个

[a-z] : 代表 a,b,c---z

[A-Z] : 代表A-Z

[a-Z] : 代表小写a-大写Z

[0-Z]:代表 0-9 - Z

#####################################

例:将 /etc/hosts文件全部转换为大写字母

[root@localhost lianxi]# 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

#####################################

例:将 /etc/hosts文件中的所有数字和 . 都删除

[root@localhost lianxi]# cat /etc/hosts | tr '[0-9.]' ' '

localhost localhost localdomain localhost localhost localdomain

:: localhost localhost localdomain localhost localhost localdomain

#####################################

1.3  使用tr删除字符串

tr -d set1

[root@localhost lianxi]# echo 12333456873333 | tr -d 3

1245687

删除所有的数字:

[root@localhost lianxi]# echo 12333456873a333bc | tr -d [0-9]

abc

#####################################

1.4  示例:删除所有的%

[root@localhost lianxi]# df -Th

文件系统 类型 容量 已用 可用 已用% 挂载点

devtmpfs devtmpfs 475M 0 475M 0% /dev

tmpfs tmpfs 487M 0 487M 0% /dev/shm

tmpfs tmpfs 487M 20M 467M 5% /run

tmpfs tmpfs 487M 0 487M 0% /sys/fs/cgroup

/dev/mapper/centos-root xfs 17G 4.4G 13G 26% /

/dev/sda1 xfs 1014M 138M 877M 14% /boot

tmpfs tmpfs 98M 0 98M 0% /run/user/0

[root@localhost lianxi]# df -Th | tr -d %

文件系统 类型 容量 已用 可用 已用 挂载点

devtmpfs devtmpfs 475M 0 475M 0 /dev

tmpfs tmpfs 487M 0 487M 0 /dev/shm

tmpfs tmpfs 487M 20M 467M 5 /run

tmpfs tmpfs 487M 0 487M 0 /sys/fs/cgroup

/dev/mapper/centos-root xfs 17G 4.4G 13G 26 /

/dev/sda1 xfs 1014M 138M 877M 14 /boot

tmpfs tmpfs 98M 0 98M 0 /run/user/0

#####################################

例:用数组将df -Th 中以/结尾的这一行中的26截取出来,不要保留%

[root@localhost lianxi]# num1=($(df -Th | grep "/$" | tr -d %))

[root@localhost lianxi]# echo ${num1[5]}

26

#####################################

1.5  使用tr压缩字符

tr -s SET

将连续相同的字符压缩成一个字符

[root@localhost lianxi]# echo 12334455 | tr -s 345

12345

[root@localhost lianxi]# echo 12334455 | tr -s 34

123455

[root@localhost lianxi]# echo 1111111112233333333334545484 | tr -s 123

1234545484

#####################################

1.5.1  示例:将df中连续的空格压缩成一个空格

[root@localhost lianxi]# df

文件系统 1K-块 已用 可用 已用% 挂载点

devtmpfs 485772 0 485772 0% /dev

tmpfs 497836 0 497836 0% /dev/shm

tmpfs 497836 20304 477532 5% /run

tmpfs 497836 0 497836 0% /sys/fs/cgroup

/dev/mapper/centos-root 17811456 4595472 13215984 26% /

/dev/sda1 1038336 140424 897912 14% /boot

tmpfs 99568 0 99568 0% /run/user/0

[root@localhost lianxi]# df | tr -s

文件系统 1K-块 已用 可用 已用% 挂载点

devtmpfs 485772 0 485772 0% /dev

tmpfs 497836 0 497836 0% /dev/shm

tmpfs 497836 20304 477532 5% /run

tmpfs 497836 0 497836 0% /sys/fs/cgroup

/dev/mapper/centos-root 17811456 4595472 13215984 26% /

/dev/sda1 1038336 140424 897912 14% /boot

tmpfs 99568 0 99568 0% /run/user/0

#####################################

2.  sort命令

sort是一个排序的命令

默认按每行的第一个字符排序

根据首字母的ASCII码值进行升序(从小到大排列)

ASCII码 (美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言

sort的默认分隔符是空白(空格和tab),多少空白都算一个分隔符

#####################################

主要选项:

-n : 按整数进行排序

-r : 递减排序

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

-t : 指定分隔符

指定按哪一列数据进行排序

#####################################

示例:

[root@localhost script]# cat student_info.txt

name age sex chinese math english

cali 36 m 80 70 75

zhao 20 m 70 60 85

wang 21 m 83 87 95

zhou 20 F 85 85 89

liu 18 m 75 65 98

#####################################

2.1  -n 按整数进行排序

2.2  -k 按指定列进行排序

[root@localhost script]# cat student_info.txt | sort -k 4 -n

name age sex chinese math english

zhao 20 m 70 60 85

liu 18 m 75 65 98

cali 36 m 80 70 75

wang 21 m 83 87 95

zhou 20 F 85 85 89

#####################################

2.3   -r 递减排序

降序排列

[root@localhost script]# cat student_info.txt | sort -k 4 -n -r

zhou 20 F 85 85 89

wang 21 m 83 87 95

cali 36 m 80 70 75

liu 18 m 75 65 98

zhao 20 m 70 60 85

name age sex chinese math english

#####################################

指定分隔符

2.4  -t 指定分隔符 (默认是空白)

例:根据 /etc/passwd 文件里第三个字段的数值大小进行降序排列

[root@localhost script]# cat /etc/passwd | sort -rn -k 3 -t :

kimi3:x:1016:1016::/home/kimi3:/bin/bash

linhucong:x:1015:1015::/huashan:/bin/bash

kimi:x:1014:1014::/home/kimi:/bin/bash

zhaojunjie:x:1013:1013::/home/zhaojunjie:/bin/bash

wangyi:x:1012:1012::/home/wangyi:/bin/bash

zhouyiwei:x:1011:1011::/home/zhouyiwei:/bin/bash

shimengmeng:x:1010:1010::/home/shimengmeng:/bin/bash

cali123:x:1008:1008::/home/cali123:/bin/bash

califeng:x:1007:1007::/home/califeng:/bin/bash

lilanqing:x:1006:1006::/home/lilanqing:/bin/bash

yalin:x:1005:1005::/home/yalin:/bin/bash

wangshenghu:x:1004:1004::/home/wangshenghu:/bin/bash

zhangjian:x:1003:1003::/home/zhangjian:/bin/bash

zhnagjian:x:1002:1002::/home/zhnagjian:/bin/bash

chenhang:x:1001:1001::/home/chenhang:/bin/bash

xiaowang:x:1000:1000::/home/xiaowang:/bin/bash

polkitd:x:999:998:User for polkitd:/:/sbin/nologin

chrony:x:998:996::/var/lib/chrony:/sbin/nologin

nginx:x:997:995:Nginx web server:/var/lib/nginx:/sbin/nologin

kimi2:x:996:994::/home/kimi2:/bin/bash

systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin

nobody:x:99:99:Nobody:/:/sbin/nologin

postfix:x:89:89::/var/spool/postfix:/sbin/nologin

dbus:x:81:81:System message bus:/:/sbin/nologin

sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin

ntp:x:38:38::/etc/ntp:/sbin/nologin

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

games:x:12:100:games:/usr/games:/sbin/nologin

operator:x:11:0:operator:/root:/sbin/nologin

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

halt:x:7:0:halt:/sbin:/sbin/halt

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

sync:x:5:0:sync:/sbin:/bin/sync

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

bin:x:1:1:bin:/bin:/sbin/nologin

root:x:0:0:root:/root:/bin/bash

#####################################

3.  uniq 命令

删除经过排序后的数据的重复记录

uniq去重只能去除连续的重复行,所以一般先用sort排序,再去重

统计重复的数据

-c 统计重复的数据

#####################################

3.1  示例:

写一个脚本进行nginx 日志统计,得到访问ip最对的前10

其中 nginx的日志路径

access.log 日志访问文件,记录了谁访问了网站,失败还是成功

/var/log/nginx/access.log

[root@localhost nginx]# cat access.log | awk '{print $1}'|uniq -c|sort -nr

18 192.168.44.130

4 192.168.44.1

统计哪个状态码最多

[root@localhost nginx]# cat access.log | awk '{print $9}' | sort|uniq -c

21 200

1 404

#####################################

4.  cut 命令

和awk一样都是截取文本的命令

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

cut -选项 提取范围 文本文件

常见选项

4.1  -c 从指定提取范围中提取字符

4.2  -f 从指定提取范围中提取字符段

提取范围:

n:第n项

n-:第n项到行尾

-m:行首到第m项

n,m:第n项和第m项--》单个的

n-m : 第n项到第m项 --》 连续的

#####################################

4.2.1   示例:-c提取字符,下标从1开始

[root@localhost script]# echo 123456|cut -c 3

3

[root@localhost script]# echo 123456|cut -c 0

cut: 序号从1 开始计数

Try 'cut --help' for more information.

[root@localhost script]# echo 123456|cut -c 5

5

[root@localhost script]# echo adfv12fefda3 |cut -c 1,3,5

af1

#####################################

4.2.2  -f 提取字符段,-d 指定分隔符

[root@localhost script]# cat /etc/passwd | cut -d : -f 1,3

root:0

bin:1

daemon:2

adm:3

lp:4

sync:5

shutdown:6

halt:7

mail:8

operator:11

games:12

ftp:14

nobody:99

systemd-network:192

dbus:81

polkitd:999

sshd:74

postfix:89

chrony:998

xiaowang:1000

chenhang:1001

zhnagjian:1002

zhangjian:1003

wangshenghu:1004

yalin:1005

nginx:997

lilanqing:1006

tss:59

califeng:1007

cali123:1008

ntp:38

shimengmeng:1010

zhouyiwei:1011

wangyi:1012

zhaojunjie:1013

kimi:1014

kimi2:996

linhucong:1015

kimi3:1016

练习

1.只显示/boot目录下所有对象的实际空间(文件的大小,占用磁盘空 间),并按由小到大排序

ll -R /boot | awk '{print $5,$9}'|sort -n

2.统计/etc/passwd中每种shell的被使用情况

[root@localhost lianxi]# cat /etc/passwd | cut -d ":" -f7 | uniq -c

3.用df -Th 命令只显示出分区和文件系统的类型,使用率

[root@localhost lianxi]# df -Th | awk '{print $1,$2,$6}'

4.统计 /etc/passwd中sbin这个单词出现多少次

[root@localhost lianxi]# cat /etc/passwd | grep sbin | tr ":" "\n" | grep sbin | wc -l

思路 : 将所有以:分隔的字符全部替换为 \n 然后再统计有多少行,就是sbin出现多少次数

5.ps aux列出前五位占MEM最多的进程的命令

[root@localhost lianxi]# ps aux | awk '{print $2,$4,$11}' | sort -rn | head -5

6.ps aux 列出前五位占cpu最多的进程的命令

[root@localhost lianxi]# ps aux | awk '{print $2,$3,$11}' | sort -rn | head -5

7.只显示网卡en33的ip地址

[root@localhost lianxi]# ip add | grep 192

8. 将 /etc/passwd文件中的名字,gid , 以及使用什么类型的shell截取出 来,并且gid>1000.

[root@localhost lianxi]# cat /etc/passwd | awk -F : ' $3>1000 {print $1,$3,$7}'

9.安装好nginx统计出访问次数最多的前三个ip地址,以及出现次数最多的 两个状态码

日志格式如下:

192.168.44.130 - - [25/Feb/2022:13:19:13 +0800] GET / HTTP/1.1 200 15 - curl/7.29.0 -

200是状态码

192.168.44.130是ip地址

[root@localhost nginx]# cat access.log |awk '{print $1,$9}' | uniq -c | sort -r | head -2