linux脚本攻略 sort,uniq,cut 命令详解

sort 命令

作用

NAME
       sort - sort lines of text files

sort 常用选项和参数:

选项与参数:
-f  :忽略大小写的差异,例如 A 与 a 视为编码相同;
-b  :忽略最前面的空格符部分;
-M  :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;
-n  :使用『纯数字』进行排序(默认是以文字型态来排序的);
-r  :反向排序;
-u  :就是 uniq ,相同的数据中,仅出现一行代表;
-t  :分隔符,默认是用 [tab] 键来分隔;
-k  :以那个区间 (field) 来进行排序的意思

sort 是默认以第一个数据来排序,而且默认是以字符串形式来排序,所以由字母 a 开始升序排序。

ld@ubuntu:~$ cat /etc/passwd | sort | head
avahi-autoipd:x:105:113:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/bin/false
avahi:x:111:117:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
colord:x:113:121:colord colour management daemon,,,:/var/lib/colord:/bin/false
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
dnsmasq:x:104:65534:dnsmasq,,,:/var/lib/misc:/bin/false
games:x:5:60:games:/usr/games:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
hplip:x:114:7:HPLIP system user,,,:/var/run/hplip:/bin/false

/etc/passwd 内容是以 : 来分隔的,我想以第三栏来排序,该如何

ld@ubuntu:~$ cat /etc/passwd | sort -t ':' -k 3 | head
root:x:0:0:root:/root:/bin/bash
ld:x:1000:1000:haha,,,:/home/ld:/bin/bash
libuuid:x:100:101::/var/lib/libuuid:
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
syslog:x:101:104::/home/syslog:/bin/false
messagebus:x:102:106::/var/run/dbus:/bin/false
usbmux:x:103:46:usbmux daemon,,,:/home/usbmux:/bin/false
dnsmasq:x:104:65534:dnsmasq,,,:/var/lib/misc:/bin/false
avahi-autoipd:x:105:113:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/bin/false
kernoops:x:106:65534:Kernel Oops Tracking Daemon,,,:/:/bin/false

默认是以字符串来排序的,如果想要使用数字排序:

ld@ubuntu:~$ cat /etc/passwd | sort -t ':' -k 3n | head
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin

默认是升序排序,如果要倒序排序,如下

ld@ubuntu:~$ cat /etc/passwd | sort -t ':' -k 3nr | head
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
ld:x:1000:1000:haha,,,:/home/ld:/bin/bash
sshd:x:116:65534::/var/run/sshd:/usr/sbin/nologin
pulse:x:115:122:PulseAudio daemon,,,:/var/run/pulse:/bin/false
hplip:x:114:7:HPLIP system user,,,:/var/run/hplip:/bin/false
colord:x:113:121:colord colour management daemon,,,:/var/lib/colord:/bin/false
lightdm:x:112:118:Light Display Manager:/var/lib/lightdm:/bin/false
avahi:x:111:117:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false
speech-dispatcher:x:110:29:Speech Dispatcher,,,:/var/run/speech-dispatcher:/bin/                                                                                        sh
whoopsie:x:109:116::/nonexistent:/bin/false

根据第一列排序,并且去重

ld@ubuntu:~$ cat /etc/passwd | sort -t ':' -k 1 -u | head
avahi-autoipd:x:105:113:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/bin/false
avahi:x:111:117:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
colord:x:113:121:colord colour management daemon,,,:/var/lib/colord:/bin/false
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
dnsmasq:x:104:65534:dnsmasq,,,:/var/lib/misc:/bin/false
games:x:5:60:games:/usr/games:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
hplip:x:114:7:HPLIP system user,,,:/var/run/hplip:/bin/false

以第六个域的第2个字符到第4个字符进行正向排序,再基于第一个域进行反向排序。

ld@ubuntu:~$ cat /etc/passwd | sort -t ':' -k 6.2,6.4 -k 1r | head
kernoops:x:106:65534:Kernel Oops Tracking Daemon,,,:/:/bin/false
sync:x:4:65534:sync:/bin:/bin/sync
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
usbmux:x:103:46:usbmux daemon,,,:/home/usbmux:/bin/false
syslog:x:101:104::/home/syslog:/bin/false
saned:x:108:115::/home/saned:/bin/false
ld:x:1000:1000:haha,,,:/home/ld:/bin/bash
whoopsie:x:109:116::/nonexistent:/bin/false

uniq

作用:


NAME
       uniq - report or omit repeated lines

常用参数

-i   :忽略大小写字符的不同;
-c  :进行计数
-u  :只显示唯一的行

-c, --count
        prefix lines by the number of occurrences
-d, --repeated
       only print duplicate lines

-D, --all-repeated[=delimit-method]
       print all duplicate lines delimit-method={none(default),prepend,separate}  Delimit‐
       ing is done with blank lines

-f, --skip-fields=N
       avoid comparing the first N fields

-i, --ignore-case
       ignore differences in case when comparing

-s, --skip-chars=N
       avoid comparing the first N characters

-u, --unique
       only print unique lines

-z, --zero-terminated
       end lines with 0 byte, not newline

-w, --check-chars=N
       compare no more than N characters in lines

--help display this help and exit

--version
       output version information and exit

重复行必须是相邻的,否则 uniq 无效。

ld@ubuntu:/mnt/hgfs/haShare/test$ cat testUniq
hello
world
friend
hello
world
hello
ld@ubuntu:/mnt/hgfs/haShare/test$ uniq testUniq
hello
world
friend
hello
world
hello

排序之后使得重复项目相邻,这样 uniq 才能生效:

ld@ubuntu:/mnt/hgfs/haShare/test$ cat testUniq | sort
friend
hello
hello
hello
world
world

ld@ubuntu:/mnt/hgfs/haShare/test$ cat testUniq | sort | uniq
friend
hello
world

排序之后删除了重复行,同时在行首位置输出该行出现的次数

ld@ubuntu:/mnt/hgfs/haShare/test$ cat testUniq | sort | uniq -c
      1 friend
      3 hello
      2 world

仅显示存在重复的行,并在行首显示该行重复的次数

ld@ubuntu:/mnt/hgfs/haShare/test$ cat testUniq | sort | uniq -dc
      3 hello
      2 world

仅显示不重复的行

ld@ubuntu:/mnt/hgfs/haShare/test$ cat testUniq | sort | uniq -uc
      1 friend
ld@ubuntu:/mnt/hgfs/haShare/test$ cat testUniq | sort | uniq -u
friend

cat 命令

作用

NAME
       cut - remove sections from each line of files

SYNOPSIS
       cut OPTION... [FILE]...

DESCRIPTION
       Print selected parts of lines from each FILE to standard output.

       Mandatory arguments to long options are mandatory for short options too.

参数:

[root@www~]# cut -d'分隔字符' -f fields 用于有特定分隔字符
[root@www~]# cut -c 字符区间            用于排列整齐的信息
选项与参数:
-d  :后面接分隔字符。与 -f 一起使用;
-f  :依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思;
-c  :以字符 (characters) 的单位取出固定字符区间;
ld@ubuntu:~$ echo $PATH
/home/ld/dev/spark/bin:/usr/lib/jvm/java-8-oracle/bin:/usr/lib/jvm/java-8-oracle/jre/bin:/home/ld/anaconda2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

将 PATH 变量取出,我要找出第3个路径。

ld@ubuntu:~$ echo $PATH | cut -d ':' -f 3
/usr/lib/jvm/java-8-oracle/jre/bin
ld@ubuntu:~$ echo $PATH | cut -d ':' -f 5
/usr/local/sbin

将 PATH 变量取出,我要找出第三和第五个路径。

ld@ubuntu:~$ echo $PATH | cut -d ':' -f 3,5
/usr/lib/jvm/java-8-oracle/jre/bin:/usr/local/sbin

将 PATH 变量取出,我要找出第二到最后一个路径。

ld@ubuntu:~$ echo $PATH | cut -d ':' -f 2-
/usr/lib/jvm/java-8-oracle/bin:/usr/lib/jvm/java-8-oracle/jre/bin:/home/ld/anaconda2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

将 PATH 变量取出,我要找出第一到第三个路径。

ld@ubuntu:~$ echo $PATH | cut -d ':' -f 1-3
/home/ld/dev/spark/bin:/usr/lib/jvm/java-8-oracle/bin:/usr/lib/jvm/java-8-oracle/jre/bin

实用例子:只显示/etc/passwd的用户和shell

ld@ubuntu:~$ cat /etc/passwd | head | cut -d ':' -f 1,7
root:/bin/bash
daemon:/usr/sbin/nologin
bin:/usr/sbin/nologin
sys:/usr/sbin/nologin
sync:/bin/sync
games:/usr/sbin/nologin
man:/usr/sbin/nologin
lp:/usr/sbin/nologin
mail:/usr/sbin/nologin
news:/usr/sbin/nologin
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值