天天看點

shell工具-sort、uniq、paste、cut、xargs詳解

sort

作用:

sort将檔案的每一行作為一個機關,互相比較,比較原則是從首字元向後,依次按ASCII碼值進行比較, 後将他們按升序輸出。

舉例如下:

[root@MiWiFi-R1CL-srv ~]# cat file
bbbbbbbb
cccccccc
dddddddd
ffffffff
cccccccc
aaaaaaaa
[root@MiWiFi-R1CL-srv ~]# sort file
aaaaaaaa
bbbbbbbb
cccccccc
cccccccc
dddddddd
ffffffff      

選項

選項 作用
-r 以降序方式排列
-u 在輸出行中去除重複行
-n 以數值來排序
-t 設定間隔符
-k 指定了間隔符之後,就可以用-k來指定列數進行排序
-f 将小寫字母都轉換為大寫字母來進行比較,即忽略大小寫
-c 會檢查檔案是否已排好序,如果亂序,則輸出第一個亂序的行的相關資訊,後傳回1
-C 會檢查檔案是否已排好序,如果亂序,不輸出内容,僅傳回1
-b 會忽略每一行前面的所有空白部分,從第一個可見字元開始比較

舉例如下:

例一:

sort的-r選項sort預設的排序方式是升序,如果想改成降序,如下:

[root@MiWiFi-R1CL-srv ~]# sort  -r file
ffffffff
dddddddd
cccccccc
cccccccc
bbbbbbbb
aaaaaaaa      

例二:在輸出行中去除重複行

[root@MiWiFi-R1CL-srv ~]# cat file
bbbbbbbb
bbbbbbbb
cccccccc
dddddddd
ffffffff
cccccccc
ffffffff
aaaaaaaa
[root@MiWiFi-R1CL-srv ~]# sort  -u file
aaaaaaaa
bbbbbbbb
cccccccc
dddddddd
ffffffff      

例三:sort的-n選項,“要以數值來排序”

[root@MiWiFi-R1CL-srv ~]# cat file
1aaaaaaa
10aaaaaa
100aaaaa
10000aaa
[root@MiWiFi-R1CL-srv ~]# sort file
10000aaa
100aaaaa
10aaaaaa
1aaaaaaa
[root@MiWiFi-R1CL-srv ~]# sort  -n file
1aaaaaaa
10aaaaaa
100aaaaa
10000aaa      

例四:sort的-t選項和-k選項。

-t選項,設定間隔符。指定了間隔符之後,就可以用-k來指定列數進行排序。

[root@MiWiFi-R1CL-srv ~]# cat file
1aaaaaaa:23
10aaaaaa:1
100aaaaa:34
10000aaa:3
[root@MiWiFi-R1CL-srv ~]# sort -t':' -nk 2 file
10aaaaaa:1
10000aaa:3
1aaaaaaa:23
100aaaaa:34      

指定分隔符,按照第二列整數進行排序

uniq

先看一個例子:

[root@MiWiFi-R1CL-srv ~]# cat file
aaaaaaa
eeeeeee
bbbbbbb
fffffff
ddddddd
bbbbbbb
bbbbbbb
ddddddd
ccccccc
[root@MiWiFi-R1CL-srv ~]# uniq file
aaaaaaa
eeeeeee
bbbbbbb
fffffff
ddddddd
bbbbbbb
ddddddd
ccccccc
[root@MiWiFi-R1CL-srv ~]# sort file | uniq
aaaaaaa
bbbbbbb
ccccccc
ddddddd
eeeeeee
fffffff      

可以看出來,uniq的作用是去除相鄰的重複行。

常用選項

選項 作用
-c 顯示輸出中,在每行行首加上本行在檔案中出現的次數,它可取代-u和-d選項
-d 隻顯示重複行
-u 隻顯示檔案中不重複的各行

舉例如下,file檔案内容如上:

[root@MiWiFi-R1CL-srv ~]# sort file | uniq -c
      1 aaaaaaa
      3 bbbbbbb
      1 ccccccc
      2 ddddddd
      1 eeeeeee
      1 fffffff
[root@MiWiFi-R1CL-srv ~]# sort file | uniq -d
bbbbbbb
ddddddd
[root@MiWiFi-R1CL-srv ~]# sort file | uniq -u
aaaaaaa
ccccccc
eeeeeee
fffffff      

paste

概念

paste單詞意思是粘貼。

該指令主要用來将多個檔案的内容合并。paste将按行将不同檔案行資訊放在一行。

預設情況下,paste連接配接時,用空格或tab鍵分隔新行中不同文本

我們看一個例子,兩個檔案的合并:

[root@MiWiFi-R1CL-srv ~]# cat file1
a
b
c
d
e
f
g
[root@MiWiFi-R1CL-srv ~]# cat file2
e
f
g
h
i
j
k
l
m
n
[root@MiWiFi-R1CL-srv ~]# paste file1 file2
a   e
b   f
c   g
d   h
e   i
f   j
g   k
    l
    m
    n      

常見選項

選項 作用
-d 指定域分隔符
-s 将每個檔案合并成行而不是按行粘貼
- 對每一個(-),從标準輸入中讀一次資料。預設使用空格或者tab作域分隔符,該選項可以定制輸出格式

舉例如下:

[root@MiWiFi-R1CL-srv ~]# paste -d# file1 file2
a#e
b#f
c#g
d#h
e#i
f#j
g#k
#l
#m
#n
[root@MiWiFi-R1CL-srv ~]# paste -d: file1 file2
a:e
b:f
c:g
d:h
e:i
f:j
g:k
:l
:m
:n
[root@MiWiFi-R1CL-srv ~]# paste -s -d: file1 file2
a:b:c:d:e:f:g
e:f:g:h:i:j:k:l:m:n
[root@MiWiFi-R1CL-srv ~]# ls /etc | paste - - - - -
abrt    acpi    adjtime aliases aliases.db
alsa    alternatives    anacrontab  asound.conf at.deny
audisp  audit   avahi   bash_completion.d   bashrc
blkid   bluetooth   bonobo-activation   centos-release  chkconfig.d
ConsoleKit  cron.d  cron.daily  cron.deny      

cut

功能

cut 指令從檔案的每一行剪切位元組、字元和字段并将這些位元組、字元和字段寫至标準輸出。

如果不指定 File 參數, cut 指令将讀取标準輸入。必須指定 -b、-c 或 -f 标志之一。

選項

選項 作用
-b 以位元組為機關進行分割
-c 以字元為機關進行分割
-d 自定義分隔符,預設為制表符
-f 與-d一起使用,指定顯示哪個區域

舉例如下:

-b:

[root@MiWiFi-R1CL-srv ~]# echo "hello world" | cut -b 1
h
[root@MiWiFi-R1CL-srv ~]# echo "hello world" | cut -b 1-3
hel
[root@MiWiFi-R1CL-srv ~]# echo "hello world" | cut -b 3
l
[root@MiWiFi-R1CL-srv ~]# echo "hello world" | cut -b 1,3
hl      

-c:

[root@MiWiFi-R1CL-srv ~]# echo "hello world" | cut -c 1
h
[root@MiWiFi-R1CL-srv ~]# echo "hello world" | cut -c 1-3
hel
[root@MiWiFi-R1CL-srv ~]# echo "hello world" | cut -c 3
l
[root@MiWiFi-R1CL-srv ~]# echo "hello world" | cut -c 1,3
hl
[root@MiWiFi-R1CL-srv ~]# echo "hello world" | cut -c 1-
hello world      

我們有必要知道,-c是以字元為機關,而-b隻會以位元組(8位二進制位)來計算,這裡的字元,不是我們C當中的占有一個位元組的字元。一個漢字也是一個字元,可以了解為是由多個位元組組成的多位元組字元。

-d,-f:

[root@MiWiFi-R1CL-srv ~]# echo "hello world" | cut -d' ' -f 1
hello
[root@MiWiFi-R1CL-srv ~]# echo "hello world" | cut -d' ' -f 1,2
hello world
[root@MiWiFi-R1CL-srv ~]# echo "hello world" | cut -d' ' -f 2
world
[root@MiWiFi-R1CL-srv ~]# echo "hello world" | cut -d' ' -f 1-
hello world
[root@MiWiFi-R1CL-srv ~]# echo "hello world" | cut -d' ' -f -2
hello world      

xargs

這是一個很強大的工具。

概念:
  1. xargs指令是給其他指令傳遞參數的一個過濾器,也是組合多個指令的一個工具。
  2. 它擅長将标準輸入資料轉換成指令行參數,xargs能夠處理管道或者stdin并将其轉換成特定指令的指令參數。
  3. xargs也可以将單行或多行文本輸入轉換為其他格式,例如多行變單行,單行變多行。
  4. xargs的預設指令是echo,空格是預設定界符。這意味着通過管道傳遞給xargs的輸入将會包含換行和空白,不過通過xargs的處理,換行和空白将被空格取代。

使用

例一:

對檔案進行格式化輸出,将檔案的多行輸入轉成單行輸出。

[root@MiWiFi-R1CL-srv ~]# cat file
1 2 3 4
5 6 7 8
a b c d 
e f g h
[root@MiWiFi-R1CL-srv ~]# cat file | xargs
1 2 3 4 5 6 7 8 a b c d e f g h      

指定列數,并多行輸出(-n):

[root@MiWiFi-R1CL-srv ~]# cat file | xargs -n3
1 2 3
4 5 6
7 8 a
b c d
e f g
h      

自定義一個域分隔符,将特定列打散,并指定格式輸出(-d)

[root@MiWiFi-R1CL-srv ~]# echo "a#b#c#d" | xargs -d#
a b c d

[root@MiWiFi-R1CL-srv ~]# echo "a#b#c#d" | xargs -d# -n1
a
b
c
d

[root@MiWiFi-R1CL-srv ~]# echo "a#b#c#d" | xargs -d# -n2
a b
c d      
[root@MiWiFi-R1CL-srv ~]# find /etc -name "*.cat" 2>/dev/null
/etc/sgml/xml-docbook-4.2-1.0-51.el6.cat
/etc/sgml/sgml-docbook-3.1-1.0-51.el6.cat
/etc/sgml/sgml-docbook-4.2-1.0-51.el6.cat
/etc/sgml/xml-docbook.cat
/etc/sgml/xml-docbook-4.5-1.0-51.el6.cat
/etc/sgml/sgml-docbook-3.0-1.0-51.el6.cat
/etc/sgml/sgml-docbook-4.3-1.0-51.el6.cat
/etc/sgml/xml-docbook-4.1.2-1.0-51.el6.cat
/etc/sgml/sgml-docbook.cat
/etc/sgml/sgml-docbook-4.1-1.0-51.el6.cat
/etc/sgml/sgml-docbook-4.0-1.0-51.el6.cat
/etc/sgml/xml-docbook-4.4-1.0-51.el6.cat
/etc/sgml/sgml-docbook-4.4-1.0-51.el6.cat
/etc/sgml/sgml-docbook-4.5-1.0-51.el6.cat
/etc/sgml/xml-docbook-4.3-1.0-51.el6.cat
[root@MiWiFi-R1CL-srv ~]# find /etc -name "*.cat" 2>/dev/null |xargs ls
/etc/sgml/sgml-docbook-3.0-1.0-51.el6.cat
/etc/sgml/sgml-docbook-3.1-1.0-51.el6.cat
/etc/sgml/sgml-docbook-4.0-1.0-51.el6.cat
/etc/sgml/sgml-docbook-4.1-1.0-51.el6.cat
/etc/sgml/sgml-docbook-4.2-1.0-51.el6.cat
/etc/sgml/sgml-docbook-4.3-1.0-51.el6.cat
/etc/sgml/sgml-docbook-4.4-1.0-51.el6.cat
/etc/sgml/sgml-docbook-4.5-1.0-51.el6.cat
/etc/sgml/sgml-docbook.cat
/etc/sgml/xml-docbook-4.1.2-1.0-51.el6.cat
/etc/sgml/xml-docbook-4.2-1.0-51.el6.cat
/etc/sgml/xml-docbook-4.3-1.0-51.el6.cat
/etc/sgml/xml-docbook-4.4-1.0-51.el6.cat
/etc/sgml/xml-docbook-4.5-1.0-51.el6.cat
/etc/sgml/xml-docbook.cat      
[root@MiWiFi-R1CL-srv ~]# cat file
aaa
bbb
ccc
ddd
[root@MiWiFi-R1CL-srv ~]# cat test.sh
#!/bin/bash

echo $@
[root@MiWiFi-R1CL-srv ~]# cat file | xargs ./test.sh
aaa bbb ccc ddd
[root@MiWiFi-R1CL-srv ~]# cat file | xargs ./test.sh -a -b
-a -b aaa bbb ccc ddd
[root@MiWiFi-R1CL-srv ~]# cat file | xargs -I {} ./test.sh -a {} -b
-a aaa -b
-a bbb -b
-a ccc -b
-a ddd -b