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
這是一個很強大的工具。
概念:
- xargs指令是給其他指令傳遞參數的一個過濾器,也是組合多個指令的一個工具。
- 它擅長将标準輸入資料轉換成指令行參數,xargs能夠處理管道或者stdin并将其轉換成特定指令的指令參數。
- xargs也可以将單行或多行文本輸入轉換為其他格式,例如多行變單行,單行變多行。
- 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