Linux - tr命令,sort命令,uniq命令,cut命令
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
原文链接:https://blog.csdn.net/qq_48391148/article/details/123122335