shell脚本快速入门之----sort、uniq和tr

2020-09-03 10:15:44 浏览数 (1)

1、sort

sort 是一个以行为单位对文件内容进行排序的工具,也可以根据不同的数据类型来排序。例如数据和字符的排序就不一样

(1)语法

sort [选项] 参数

(2)常用选项

-t:指定分隔符,默认使用[Tab]键分隔 -k:指定排序区域 -n:按照数字进行排序 -u:等同于 uniq,表示相同的数据仅显示一行 -r:反向排序,默认是升序,-r就是降序 -o:将排序后的结果转存至指定文件

(3)实例

不加任何选项默认按第一列升序,字母的话就是从a到z由上而下显示

代码语言:javascript复制
[root@server ~]# sort passwd.txt 
adm:x:3:4:adm:/var/adm:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sync:x:5:0:sync:/sbin:/bin/sync

以冒号为分隔符,以数字大小对第三列排序(升序)

代码语言:javascript复制
[root@server ~]# sort -n -t: -k3 passwd.txt 
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

以冒号为分隔符,以数字大小对第三列排序(降序)

代码语言:javascript复制
[root@server ~]# sort -nr -t: -k3 passwd.txt 
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

将输结果不在屏幕上输出而是输出到passwd.bak文件

代码语言:javascript复制
[root@server ~]# sort -nr -t: -k3 passwd.txt -o passwd.bak
[root@server ~]# 
[root@server ~]# cat passwd.bak 
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

去掉1.txt文件中重复的行(重复的行可以是不连续的)

代码语言:javascript复制
[root@server ~]# cat 1.txt
aaaaa
bbb
3333
ccc
111
3333
ccc
111
4444
[root@server ~]# sort -u 1.txt
111
3333
4444
aaaaa
bbb
ccc

2、uniq

主要用于去除连续的重复行

(1)语法

uniq [选项] 参数

(2)常用选项

-c:对重复的行进行计数; -d:仅显示重复行; -u:仅显示出现一次的行

(3)实例

不加任何选项就是去掉连续的重复的行然后输出结果

代码语言:javascript复制
[root@server ~]# cat 1.txt
aaaaa
bbb
3333
3333
ccc
ccc
ccc
111
111
[root@server ~]# uniq 1.txt
aaaaa
bbb
3333
ccc
111

对重复的行记数并显示

代码语言:javascript复制
[root@server ~]# uniq -c 1.txt
      1 aaaaa
      1 bbb
      2 3333
      3 ccc
      2 111

只显示出重复的行

代码语言:javascript复制
[root@server ~]# uniq -d 1.txt
3333
ccc
111

只显示没有重复的行

代码语言:javascript复制
[root@server ~]# uniq -u 1.txt
aaaaa
bbb

3、tr

它可以用一个字符来替换另一个字符,或者可以完全除去一些字符,也可以用它来除去重复字符

(1)语法

用法:tr [选项]… SET1 [SET2] 从标准输入中替换、缩减和/或删除字符,并将结果写到标准输出。

(2)常用选项

-d 删除字符 -s 删除所有重复出现的字符,只保留第一个

(3)实例

将小写字母替换成大写字母(tr的替换是一一对应的,比如a就替换成A,b就替换成B……)

代码语言:javascript复制
[root@server ~]# tr 'a-z' 'A-Z' < passwd.txt 
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

将bin替换成abc,就是将b替换成a,i替换成b,n替换成c

代码语言:javascript复制
[root@server ~]# tr 'bin' 'abc' < passwd.txt 
root:x:0:0:root:/root:/abc/ash
abc:x:1:1:abc:/abc:/sabc/cologbc
daemoc:x:2:2:daemoc:/sabc:/sabc/cologbc
adm:x:3:4:adm:/var/adm:/sabc/cologbc
lp:x:4:7:lp:/var/spool/lpd:/sabc/cologbc
syc:x:5:0:syc:/sabc:/abc/syc
shutdowc:x:6:0:shutdowc:/sabc:/sabc/shutdowc
halt:x:7:0:halt:/sabc:/sabc/halt
mabl:x:8:12:mabl:/var/spool/mabl:/sabc/cologbc
operator:x:11:0:operator:/root:/sabc/cologbc

将文件中的数字都替换为@

代码语言:javascript复制
[root@server ~]# tr '0-9' '@' < passwd.txt 
root:x:@:@:root:/root:/bin/bash
bin:x:@:@:bin:/bin:/sbin/nologin
daemon:x:@:@:daemon:/sbin:/sbin/nologin
adm:x:@:@:adm:/var/adm:/sbin/nologin
lp:x:@:@:lp:/var/spool/lpd:/sbin/nologin
sync:x:@:@:sync:/sbin:/bin/sync
shutdown:x:@:@:shutdown:/sbin:/sbin/shutdown
halt:x:@:@:halt:/sbin:/sbin/halt
mail:x:@:@@:mail:/var/spool/mail:/sbin/nologin
operator:x:@@:@:operator:/root:/sbin/nologin

将文件中的 :和 / 都替换成 #(想替换的都可以用单引号引起来,包括空格逗号)

代码语言:javascript复制
[root@server ~]# tr ':/' '#' < passwd.txt 
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

删除所有小写字母

代码语言:javascript复制
[root@server ~]# tr -d 'a-z' < passwd.txt 
::0:0::/://
::1:1::/://
::2:2::/://
::3:4:://://
::4:7::///://
::5:0::/://
::6:0::/://
::7:0::/://
::8:12::///://
::11:0::/://

删除所有数字和 :和 /

代码语言:javascript复制
[root@server ~]# tr -d '0-9:/' < passwd.txt 
rootxrootrootbinbash
binxbinbinsbinnologin
daemonxdaemonsbinsbinnologin
admxadmvaradmsbinnologin
lpxlpvarspoollpdsbinnologin
syncxsyncsbinbinsync
shutdownxshutdownsbinsbinshutdown
haltxhaltsbinsbinhalt
mailxmailvarspoolmailsbinnologin
operatorxoperatorrootsbinnologin

删除字母b、i、n,虽然写在一起了,不代表就是以一个单词的形式删除,它会把含有b或i或n的都删除

代码语言:javascript复制
[root@server ~]# tr -d 'bin' < passwd.txt 
root:x:0:0:root:/root://ash
:x:1:1::/:/s/olog
daemo:x:2:2:daemo:/s:/s/olog
adm:x:3:4:adm:/var/adm:/s/olog
lp:x:4:7:lp:/var/spool/lpd:/s/olog
syc:x:5:0:syc:/s://syc
shutdow:x:6:0:shutdow:/s:/s/shutdow
halt:x:7:0:halt:/s:/s/halt
mal:x:8:12:mal:/var/spool/mal:/s/olog
operator:x:11:0:operator:/root:/s/olog

删除换行符

代码语言:javascript复制
[root@server ~]# tr -d 'n' < passwd.txt 
root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologin[ro

压缩换行符(删除空行)

代码语言:javascript复制
[root@server ~]# vim passwd.txt 

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

[root@server ~]# tr -s 'n' < passwd.txt 
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

压缩重复的字符

代码语言:javascript复制
[root@server ~]# cat 1.txt
aaaaabbbccc
abcabc
11133334444
134134134

[root@server ~]# tr -s 'abc' < 1.txt
abc
abcabc
11133334444
134134134

也可以用于命令的二次处理,将输出结果的冒号替换成换行

代码语言:javascript复制
[root@server ~]# echo $PATH | tr -s ":" "n"
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/root/bin

0 人点赞