linux基礎命令介紹二:輸入與輸出

在第一篇介紹命令行接口時,咱們是這樣描述CLI的:是一種經過在終端窗口中鍵入文本命令來實現與計算機交互的接口。
這裏簡要說明一下終端的概念,歷史上,控制檯終端都是硬件。其中控制檯(console)是計算機自己就有的設備,一臺計算機只有一個控制檯。計算機啓動的時候,全部的信息都會顯示到控制檯上。而終端(terminal)屬於外圍設備(顯示器和鍵盤),一般經過串口與計算機相連,而後對計算機進行操做。計算機操做系統中,與終端不相關的信息,好比內核消息,後臺服務消息,不會顯示到終端上。因爲控制檯與終端都起着顯示信息的做用,因而隨着時間的推移,它們之間的區別也愈來愈模糊。如今,計算機硬件愈來愈便宜,一般再也不鏈接之前那種真正意義上的「終端設備」了,終端和控制檯由硬件的概念,逐漸演化成了軟件的概念。當前所說的終端,好比linux中的虛擬終端,都是軟件的概念。
如上一篇中提到的命令who的輸出:node

root     tty1         2016-09-30 15:18
root     pts/0        2016-10-23 17:12 (192.168.78.140)
learner  pts/1        2016-10-23 17:49 (192.168.78.140)
root     pts/2        2016-10-23 17:50 (192.168.78.140)

這裏的第二列即爲用戶登陸系統所使用的終端。其中tty1即爲虛擬終端。它對應於linux中的字符設備文件/dev/tty[n]
上面所說的控制檯對應的的設備文件是/dev/console
後三行中pst/[n]僞終端,對應設備文件/dev/pts/[n]。僞終端是指經過telnet、ssh等程序登陸系統時,所使用的終端。linux

現在,做爲linux系統管理員,一般經過遠程登陸的方式來管理處於遠端機房的計算機。雖然,愈來愈多的初步管理功能能夠經過平臺在網頁上操做實現。可是,網頁管理平臺沒法提供靈活性,不能實現許多高級功能,對於異構的環境甚至能夠說是「每設備一個管理平臺」。這實際上加劇了管理者的心智負擔。反而是字符終端,始終是統一簡潔的界面,靈活並且不少狀況下能夠通用的操做,成爲linux高級管理者的首選。
咱們經過遠程登陸軟件登陸到操做系統之時,操做系統即啓動一個shell供咱們使用。在咱們的實驗中,意味着啓動了一個bash程序。bash支持標準輸入(stdin),標準輸出(stdout),標準錯誤(stderr)三個數據流。對應着/dev目錄下的三個連接文件(指向另外一個文件):git

lrwxrwxrwx 1 root root 15 9月  30 15:17 stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 9月  30 15:17 stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 9月  30 15:17 stdout -> /proc/self/fd/1

咱們再看所指向的文件:shell

[root@centos7 ~]# ls -l /proc/self/fd/
總用量 0
lrwx------ 1 root root 64 10月 25 20:50 0 -> /dev/pts/0
lrwx------ 1 root root 64 10月 25 20:50 1 -> /dev/pts/0
lrwx------ 1 root root 64 10月 25 20:50 2 -> /dev/pts/0

它們都指向了同一個字符設備文件/dev/pts/0,而這個文件就是咱們當前所用的終端(如前所述)。編程

[root@centos7 ~]# ls -l /dev/pts/0
crw--w---- 1 root tty 136, 0 10月 25 20:52 /dev/pts/0

也就是說,bash的三個數據流都指向終端。因而,咱們用鍵盤鍵入字符(標準輸入),執行命令後的輸出(標準輸出),命令執行出錯(標準錯誤),都顯示在終端窗口之上。
又由於在linux中全部的操做都抽象成對文件的操做,因而bash對這三個數據流的操做,也一樣轉化成對文件的操做。bash經過文件描述符(file descriptor)來區分每一個打開的文件,系統爲每一個進程(如bash)維護一個文件描述符表,該表的值都是從0開始的數字。如前面目錄/proc/self/fd內的三個連接文件0,1,2就是當前bash打開的前三個文件,而且分別關聯到本身的標準輸入,標準輸出和標準錯誤上。
下面看命令:centos

一、echo 打印文本

echo [OPTION]... [STRING]...

此命令輸出字符串到屏幕上,字符串能夠帶引號也能夠不帶,一般爲了不混淆會帶上雙引號。bash

[root@centos7 ~]# echo 12345
12345

選項-n的做用是不輸出換行符:網絡

[root@centos7 ~]# echo -n "12345"
12345[root@centos7 ~]#

選項-e會對如下反斜線引用的字符作特殊處理:ssh

\a     發出警告聲
\b     退格
\c     抑制輸出後面的字符而且最後不會換行
\E     轉義字符
\f     換頁
\n     換行
\r     回車
\t     水平製表符
\v     垂直製表符
\\     反斜線
\0nnn  插入nnn(0到3個八進制數)所表明的ASCII字符

讀者能夠自行在終端輸入以下命令查看效果:函數

echo -ne "hello world"
echo -ne "hello world\n"
echo -ne "hello world\r"
echo -ne "hello\tworld\n"
echo -ne "hello\vworld\n"
echo -ne "hello\cworld\n"
echo -ne "hello world\b"

也能夠用echo輸出帶顏色的字符,須要使用ANSI控制碼。ANSI控制碼開始的標誌都爲ESC[,ESC對應ASCII碼錶的33(八進制),因此echo命令使用-e選項啓用轉義,用"\033"來輸入ESC。以下命令echo的參數中:

echo -e "\033[42;36msomething here\033[0m"

\033[ 表示ANSI控制碼的起始標誌
42 表示字體背景顏色碼,範圍是40-49,42表示綠色。
;  用來分隔
36 表示字體顏色碼,範圍是30-39,36表示深綠色。
36後面的m是標誌字符,表示後面緊跟着要輸出的字符串。
字符串尾部控制碼以後的0m表示關閉全部屬性。

命令效果如圖:

圖片描述
ANSI控制碼不只能夠控制輸出字符顏色,還能控制顯示效果和光標移動等,感興趣的讀者請自行搜索。

二、seq 打印排序的數字

seq [OPTION]... FIRST INCREMENT LAST

其中起始數字(FIRST)和增量(INCREMENT)能夠省略:

[root@centos7 ~]# seq 5
1
2
3
4
5
[root@centos7 ~]#

或者:

[root@centos7 ~]# seq 1 2 10
1
3
5
7
9
[root@centos7 ~]#

或者倒序:

[root@centos7 ~]# seq 10 -2 0
10
8
6
4
2
0
[root@centos7 ~]#

選項-s能夠指定數字間的分隔符(separator),默認是換行符(\n):

[root@centos7 ~]# seq -s : 10
1:2:3:4:5:6:7:8:9:10
[root@centos7 ~]#

或:

[root@centos7 ~]# seq -s " " 10
1 2 3 4 5 6 7 8 9 10
[root@centos7 ~]#

三、printf 格式化輸出數據

printf FORMAT [ARGUMENT]...

其中格式(FORMAT)與C語言的printf函數一致,格式中的轉義字符與echo中一致:

[root@centos7 ~]# printf "%s\n\t%d\n" "abcdefg" "800"  
abcdefg
        800
[root@centos7 ~]#

更多用法請參照C語言printf函數。

四、sleep 指定時間的延遲

sleep NUMBER[SUFFIX]...

sleep命令正如它的名字所預示的,"沉睡"一段時間,後面跟數字,默認是秒。如命令:

sleep 3

命令不會有任何輸出,只是暫停3秒。這3秒內當前shell不能接受輸入。這裏的NUMBER能夠是浮點數,SUFFIX能夠是s(秒)、m(分)、h(時)和d(天)。

五、tac 反向打印文件內容

tac [OPTION]... [FILE]...

tac命令與cat命令相反,是從最後一行開始,反向打印整個文件的內容:

[root@centos7 temp]# cat file1
hello
world
!
[root@centos7 temp]# tac file1 
!
world
hello

六、wc 統計行數、詞數、字符數等

wc [OPTION]... [FILE]...

選項-c統計字節數:

[root@centos7 temp]# wc -c file1
14 file1

文件file1中字符佔14字節。
選項-m統計字符數:

[root@centos7 temp]# wc -m file1
14 file1

文件file1中有14個字符。當有多字節字符時會與選項-c的結果有區別。
選項-l統計行數:

[root@centos7 temp]# wc -l file1
3 file1

文件file1中有三行。
選項-w統計詞數:

[root@centos7 temp]# cat file3 
hello world! 你好, 世界!
[root@centos7 temp]# wc -w file3
4 file3

文件file3中有4個詞,這裏的詞(word)是空格分隔的。
wc命令後面沒有選項,直接跟文件的話,顯示的分別爲行數、詞數、字節數、文件名(若是後面沒有文件的話則從標準輸入讀取內容):

[root@centos7 temp]# wc file3
 1  4 33 file3

七、stat 顯示文件詳細屬性信息(元信息)

stat [OPTION]... FILE...

如:

[root@centos7 temp]# stat file1
  文件:"file1"
  大小:14              塊:8          IO 塊:4096   普通文件
設備:fd00h/64768d      Inode:856994      硬連接:1
權限:(0644/-rw-r--r--)  Uid:( 1000/ learner)   Gid:(    0/    root)
最近訪問:2016-10-26 11:01:22.911946767 +0800
最近更改:2016-10-26 11:01:19.672946995 +0800
最近改動:2016-10-26 11:01:19.672946995 +0800
建立時間:-

顯示信息包括文件名,內容大小,所佔塊大小,文件類型,所在設備,inode號,硬連接數,權限信息與時間戳。與使用了-l選項的ls命令輸出有許多相同的地方,只是更詳細:

[root@centos7 temp]# ls -l file1
-rw-r--r-- 1 learner root 14 10月 26 11:01 file1

這裏說一下軟硬連接和時間戳,其他的等到講linux虛擬文件系統的時候再詳細敘述。linux中全部東西均可以當作是文件,每個文件都與一個inode對應,inode的本質是結構體,每一個結構體內部都包含有文件的各類屬性信息,如上面命令stat file1所顯示的就是來自於file1對應的inode結構體內的信息。在linux操做系統中,並非經過文件名而是經過inode號(注意這裏是inode號而不是inode結構體,結構體中包含inode號)來識別文件的,對系統來講,文件名只是inode號的別稱。並且linux中容許多個文件名指向同一個inode號,這意味着,能夠用不一樣的文件名訪問一樣的內容;但刪除一個文件名,不影響另外一個文件名的訪問。這種狀況被稱爲"硬連接"(hard link)。
每一個文件在建立時都有三個時間生成:atime(access time)表示文件最近一次被訪問的時間,mtime(modify time)表示文件內容最近一次被修改的時間,ctime(change time)表示文件元信息最近一次被修改的時間。要注意當文件內容被修改,必定意味着文件元信息被修改。因此當文件mtime變化時,ctime也會變。但當使用命令chmodchown等改變文件屬性信息時,只有ctime會變化,mtime和atime均不變。

八、ln 在文件間建立連接

ln [OPTION]... TARGET LINK_NAME

如給文件file1建立硬連接文件file2:

[root@centos7 temp]# ln file1 file2
[root@centos7 temp]# ls -i file1
856994 file1
[root@centos7 temp]# ls -i file2
856994 file2
[root@centos7 temp]#

命令ls -i顯示出兩個文件的inode號是同樣的,對系統來講,file1與file2實際上是同一個文件。當刪除一個文件的時候,只有文件的硬連接數爲0時,這個文件才被刪除。
除了硬連接之外,還有一種特殊狀況。文件A和文件B的inode號碼雖然不同,可是文件A的內容是文件B的路徑。讀取文件A時,系統會自動將訪問者導向文件B。這時,文件A就稱爲文件B的"軟連接"(soft link)或者"符號連接"(symbolic link)。
如使用選項-s給文件file3建立軟連接文件file4:

[root@centos7 temp]# ln -s file3 file4
[root@centos7 temp]# ls -l file4
lrwxrwxrwx 1 root root 5 10月 26 12:53 file4 -> file3

這裏就看到file4實際上是指向file3的連接文件。打開文件file4就意味着打開file3,file4依賴file3存在,若是刪除了file3,打開file4就會報錯:

[root@centos7 temp]# cat file3
hello world! 你好, 世界!
[root@centos7 temp]# cat file4
hello world! 你好, 世界!
[root@centos7 temp]# rm -f file3
[root@centos7 temp]# cat file4
cat: file4: 沒有那個文件或目錄

另外要注意,硬連接不能跨文件系統(分區),軟連接能夠。

九、md5sum 計算和檢查文件的MD5校驗和

md5sum [OPTION]... [FILE]...

常被用來驗證來自於網絡的文件完整性。

[root@centos7 temp]# md5sum file1 file2
33788144c53d1cb332f006ad2ef183c8  file1
33788144c53d1cb332f006ad2ef183c8  file2

文件file1和file2是指向同一個inode號的兩個文件,它們具備相同的校驗和。

十、split 拆分文件

split [OPTION]... [INPUT [PREFIX]]

選項-l指按行數分割:

[root@centos7 temp]# split -l 1 file1 
[root@centos7 temp]# ls
dir1  file1  file2  file3  file4  xaa  xab  xac
[root@centos7 temp]# cat xaa
hello
[root@centos7 temp]# cat xab
world
[root@centos7 temp]# cat xac
!

例子中將文件file1每行分割成一個文件,不指定目標文件名的前綴(PREFIX)時,使用默認前綴x,並用xaa,xab,xac,xad...的樣式順序命名。
選項-a能夠指定後綴的長度(默認是2),選項-b是按大小(bytes)來拆分。若是後面沒有文件的話則從標準輸入讀取內容。

十一、<,>,&,| 輸入輸出重定向及管道

在終端上打印出來的內容並不會一直存在,有時候會須要將命令的執行結果保存在文件裏以備未來查看,這時就須要用到以上字符。
還記得文章開始時所說的三個數據流嗎?它們分別是標準輸入,標準輸出和標準錯誤。每一個命令都有這三個數據流,它們的文件描述符都是0、1和2,而且均指向終端(咱們的屏幕上)。咱們要保存輸出結果到文件裏,無非是將本來指向終端的文件描述符如今指向文件便可。
如:

[root@centos7 temp]# cat file1
hello
world
!
[root@centos7 temp]# cat file1 > file5
[root@centos7 temp]# cat file5
hello
world
!

第一個命令cat file1將文件內容輸出到屏幕上,第二個命令cat file1 > file5使用符號>將標準輸出指向了文件file5(重定向符號和文件之間有沒有空格均可以),因而file5中就保存了cat命令的輸出。
又如:

[root@centos7 temp]# echo "learnning" > file6
[root@centos7 temp]# cat file6
learnning

命令echo本來要輸出在終端上的字符串被寫進了文件file6,這裏的符號>省略了文件描述符1(標準輸出),寫全是這樣1>。注意這裏只是將標準輸出重定向了,標準錯誤(文件描述符2)並無。如:

[root@centos7 temp]# ls -l xaa xab xac xad
ls: 沒法訪問xad: 沒有那個文件或目錄
-rw-r--r-- 1 root root 6 10月 26 13:48 xaa
-rw-r--r-- 1 root root 6 10月 26 13:48 xab
-rw-r--r-- 1 root root 2 10月 26 13:48 xac
[root@centos7 temp]#
[root@centos7 temp]# ls -l xaa xab xac xad > file7
ls: 沒法訪問xad: 沒有那個文件或目錄
[root@centos7 temp]# 
[root@centos7 temp]#
[root@centos7 temp]# cat file7
-rw-r--r-- 1 root root 6 10月 26 13:48 xaa
-rw-r--r-- 1 root root 6 10月 26 13:48 xab
-rw-r--r-- 1 root root 2 10月 26 13:48 xac

第一個命令標準輸出和標準錯誤都輸出到屏幕,第二個將標準輸出重定向到file7,屏幕上輸出了標準錯誤,文件file7中只保存了標準輸出。
能夠這樣將標準輸出和標準錯誤(文件描述符2)都重定向到文件:

[root@centos7 temp]# ls -l xaa xab xac xad >file8 2>&1
[root@centos7 temp]# cat file8
ls: 沒法訪問xad: 沒有那個文件或目錄
-rw-r--r-- 1 root root 6 10月 26 13:48 xaa
-rw-r--r-- 1 root root 6 10月 26 13:48 xab
-rw-r--r-- 1 root root 2 10月 26 13:48 xac

例子中2>&1意思是將標準錯誤重定向到標準輸出,由於以前(按重定向出現的順序,從左至右)標準輸出已經被重定向到文件file8了,因此這時file8內保存了標準輸出和標準錯誤。這裏須要注意書寫順序,若是寫成這樣2>&1 >file8,文件中就只剩標準輸出而沒有標準錯誤了。

另外一個關於重定向符號順序的例子:

[root@centos7 temp]# >file9 cat file1
[root@centos7 temp]# cat file9
hello
world
!

這裏先將標準輸出重定向到文件file9,而後執行命令,效果和寫到後面是同樣的。另外,重定向符號後面的文件不存在時,會建立新文件,重定向符號後面文件原來有內容時,會清空原有內容。若要保留原有內容,須要將重定向符寫成>>,2>>的形式,表示追加。

另外一個建立新文件(或者說清空文件)的例子:

[root@centos7 temp]# >file10
[root@centos7 temp]# ls -l
總用量 44
drwxr-xr-x 4 root    root  40 10月 23 21:04 dir1
-rw-r--r-- 2 learner root  14 10月 26 14:15 file1
-rw-r--r-- 1 root    root   0 10月 26 15:27 file10
-rw-r--r-- 2 learner root  14 10月 26 14:15 file2
....

重定向標準輸出和標準錯誤還有兩種寫法>&file,&>file。它們和前面的>file 2>&1效果是同樣的,屬於簡寫:

[root@centos7 temp]# ls -l xaa xab xac xad &>file10 #這裏若是須要追加則寫成 &>>file10
[root@centos7 temp]# cat file10
ls: 沒法訪問xad: 沒有那個文件或目錄
-rw-r--r-- 1 root root 6 10月 26 13:48 xaa
-rw-r--r-- 1 root root 6 10月 26 13:48 xab
-rw-r--r-- 1 root root 2 10月 26 13:48 xac

linux中有兩個特殊的設備文件/dev/null/dev/zero。其中/dev/null是空設備,也稱爲位桶(bit bucket)。任何寫入它的輸出都會被拋棄。/dev/zero設備能夠無窮地提供空字符,一般用來生成指定大小的空文件。
當用戶不關心一個命令的輸出時能夠將輸出重定向到/dev/null中拋棄:

[root@centos7 temp]# ls -l xaa xab xac xad 2>/dev/null >file10
[root@centos7 temp]# cat file10
-rw-r--r-- 1 root root 6 10月 26 18:01 xaa
-rw-r--r-- 1 root root 6 10月 26 18:01 xab
-rw-r--r-- 1 root root 2 10月 26 18:01 xac

十二、tee 從標準輸入讀取內容並輸出到標準輸出和文件中

tee [OPTION]... [FILE]...

不帶選項時會清空文件的原有內容,選項-a做用是在原有內容基礎之上追加內容。
咱們從這舉例說明標準輸入的狀況:

[root@centos7 temp]# tee file11 <file1
hello
world
!
[root@centos7 temp]# cat file11
hello
world
!

命令tee本來是從標準輸入中讀取內容的,這裏咱們把文件file1的內容重定向到標準輸入(省略了文件描述符0),因而tee就將輸入的內容打印到標準輸出而且寫入file11
這樣的寫法也是同樣的(注意這裏用了選項-a表示追加):

[root@centos7 temp]# <file1 tee -a file11
hello
world
!
[root@centos7 temp]# cat file11
hello
world
!
hello
world
!

1三、sort 輸出排好序的文件內容

sort [OPTION]... [FILE]...

命令sort的做用是將輸入或文件內容排序輸出:

[root@centos7 temp]# sort file11 
!
!
hello
hello
world
world

選項-u表示忽略重複的行:

[root@centos7 temp]# sort -u file11
!
hello
world

選項-r表示反向輸出:

[root@centos7 temp]# sort -ru file11
world
hello
!

注意sort排序是按每字符從小到大的順序(若是是字母和其餘符號,按ascii碼中出現的順序)來排序的。

在linux中,常常會須要用一個命令去處理另外一個命令的輸出,若是咱們將命令的輸出重定向到另外一個命令的標準輸入,豈不省了不少事!linux的管道(||&)就是用來作這些的。
用前面的命令seq舉個例子:

[root@centos7 temp]# seq 1 3 10
1
4
7
10

下面加入管道(注意排序順序):

[root@centos7 temp]# seq 1 3 10 | sort
1
10
4
7

這裏就將seq命令的輸出重定向到sort命令的標準輸入,sort將處理結果輸出到屏幕上。管道符兩側的空格能夠省略。
命令sort的選項-n用來對數字進行排序(這裏還用了-r,從大到小排列):

[root@centos7 temp]# seq 1 3 10|sort -rn
10
7
4
1

sort還能夠根據分段中的某些域進行排序,默認域分隔符是空格:

[root@centos7 temp]# ls -l|tail -n 15|sort -rnk 5   #這裏連用兩個管道
-rw-r--r-- 1 root    root 181 10月 26 18:01 file8
-rw-r--r-- 1 root    root 181 10月 26 18:01 file10
-rw-r--r-- 1 root    root 132 10月 26 18:01 file7
-rw-r--r-- 1 root    root  64 10月 26 18:01 file11
drwxr-xr-x 4 root    root  40 10月 26 18:01 dir1
-rw-r--r-- 1 root    root  33 10月 26 18:01 file3
-rw-r--r-- 2 learner root  14 10月 26 18:02 file2
-rw-r--r-- 2 learner root  14 10月 26 18:02 file1
-rw-r--r-- 1 root    root  14 10月 26 18:01 file9
-rw-r--r-- 1 root    root  14 10月 26 18:01 file5
-rw-r--r-- 1 root    root  10 10月 26 18:01 file6
-rw-r--r-- 1 root    root   6 10月 26 18:01 xab
-rw-r--r-- 1 root    root   6 10月 26 18:01 xaa
lrwxrwxrwx 1 root    root   5 10月 26 13:05 file4 -> file3
-rw-r--r-- 1 root    root   2 10月 26 18:01 xac

例子中sort對輸出中的第五個字段(文件大小那一列)的數字進行從大到小的排序並輸出。
選項-t爲sort指定域分隔符:

[root@centos7 temp]# head -n5 /etc/passwd|sort -t ":" -k 6.2,6.7
bin:x:1:1:bin:/bin:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
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

此例中選項-t用冒號:對文件/etc/passwd的前五行進行了域分隔,並使用選項-k對第6個字段第二個字符到第6個字段第七個字符進行排序後輸出。
若是須要將標準錯誤也重定向的話只需將|換爲|&,管道和重定向在linux中使用很是頻繁,後面還會有不少例子。

1四、uniq 統計或忽略重複的行

uniq [OPTION]... [INPUT [OUTPUT]]

命令的做用是將連續重複的行歸併到第一次出現的位置輸出,一般配合sort來使用:

[root@centos7 temp]# cat file11|sort
!
!
hello
hello
world
world
[root@centos7 temp]# 
[root@centos7 temp]# cat file11|sort|uniq  
!
hello
world

或者使用選項-c統計重複行的次數(輸出第一列表示次數,第二列是內容):

[root@centos7 temp]# cat file11|sort|uniq -c
      2 !
      2 hello
      2 world

或者對結果再排序,讓它們按行數從大到小排列(注意這裏命令echo和追加輸出重定向的用法):

[root@centos7 temp]# echo -e "hello\nhello\nhello\nworld\nhello\nworld" >> file11  
[root@centos7 temp]# cat file11|sort|uniq -c|sort -rn  #這裏三個管道
      6 hello
      4 world
      2 !

1五、cut 對文件中每行進行字段截取

cut OPTION... [FILE]...

cut默認使用"\t"(水平製表符,由tab鍵產生)做爲域分隔符,選項-d能夠指定分隔符(只能是一個字符),選項-f後跟隨須要輸出的域號:

[root@centos7 temp]# head -n5 /etc/passwd|cut -d ":" -f 1-4
root:x:0:0
bin:x:1:1
daemon:x:2:2
adm:x:3:4
lp:x:4:7

使用冒號對head的輸出進行域分隔,並輸出第一到第四列。這裏的1-4還能夠是這些格式:
n- 表示從第n域到最後
-m 表示從第一到第m域
n 表示第n域
n,m表示第n和第m域
選項-b-c分別表示按字節和按字符分隔輸出指定域,這時將分隔符做爲一個字符處理,不起分隔做用。當內容沒有多字節字符時,這兩個的輸出結果是同樣的。當有多字節字符時,選項-b的輸出可能會出現亂碼。它們指定輸出域的格式也和選項-f同樣:

[root@centos7 temp]# echo hello world|cut -b 2-3,5-10
elo worl
[root@centos7 temp]# echo hello world | cut -c 5-
o world

1六、shell通配符及命令行快捷鍵

* ? [...]     # bash中支持三種標準通配符,當查找文件時,用通配符來代替一個或多個真正字符

*匹配0到多個任意字符:

[root@centos7 temp]# ls x*
xaa  xab  xac
[root@centos7 temp]#

這裏x*表示當前目錄下第一個字符爲x後面不論有或沒有,有多少字符都會被*匹配到,而後把匹配到的文件做爲命令ls的參數執行。

[root@centos7 temp]# ls *
file1  file10  file11  file12  file2  file3  file4  file5  file6  file7  file8  file9  xaa  xab  xac

?匹配一個任意字符:

[root@centos7 temp]# ls file?
file1  file2  file3  file4  file5  file6  file7  file8  file9
[root@centos7 temp]#

注意這裏與上面兩個例子的不一樣,?匹配一個,不能多也不能少。

[]匹配它內部的任意單個字符:

[root@centos7 temp]# ls file[1357]
file1  file3  file5  file7
[root@centos7 temp]# ls xa[bcdef]
xab  xac

[]內部還能夠寫成這樣表示一個字符範圍:

[root@centos7 temp]# ls file[1-9] 
file1  file2  file3  file4  file5  file6  file7  file8  file9
[root@centos7 temp]# ls x[a-c][a-b]
xaa  xab

當[]內部緊跟在[後面的字符是^!時,表示取反,不在這個範圍內的字符會被匹配到:

[root@centos7 temp]# ls file[^2-8]
file1  file9
[root@centos7 temp]#
[root@centos7 temp]# ls file[!2-8]?
file10  file11  file12

在[]內部還支持字符組,字符組的格式是[:class:],其中字符組能夠是以下類型:

alnum 匹配字母和數字
alpha 匹配字母
ascii 匹配ASCII碼
blank 匹配空格和製表符'\t'
cntrl 匹配控制字符
digit 匹配數字
graph 匹配非空白字符
lower 匹配小寫字母
print 相似graph,但包含空白字符
punct 匹配標點符號
space 匹配空白字符
upper 匹配大寫字母
word  匹配字母、數字和下劃線_
xdigit匹配十六進制數字

如:

[root@centos7 temp]# ls file[[:digit:]]?
file10  file11  file12
[root@centos7 temp]# ls x[![:upper:]][a-c]
xaa  xab  xac
[root@centos7 temp]#

[]中還支持使用逗號,來表示或者:

[root@centos7 temp]# ls -l ab[a,c]
-rw-r--r-- 1 root root 0 11月  7 17:42 aba
-rw-r--r-- 1 root root 0 11月  7 17:42 abc

在交互模式下還有一些快捷鍵能使咱們更高效的使用命令行:
tab鍵用來補全命令和路徑名,當咱們輸入一個命令或一個路徑時,若是命令或路徑還沒寫全,這時按下tab鍵,shell會自動幫咱們補全路徑和命令名,當shell搜索到多個結果時,再次按下tab鍵會在終端輸出可能的結果。
CTRL+C用來強制中斷程序的執行,如在前臺運行了一個長時間執行的命令,這時咱們不想再運行它了,能夠按CTRL+C鍵來終止執行。
CTRL+L鍵用來清屏,它和命令clear的做用同樣。
CTRL+P或上箭頭鍵,顯示上一條命令
CTRL+N或下箭頭鍵,顯示下一條命令
在編輯一條命令時:
CTRL+A將光標移動到當前行開頭
CTRL+E將光標移動到當前行結尾
CTRL+U剪切命令行中光標所在處以前的全部字符(不包括自身)
CTRL+K剪切命令行中光標所在處以後的全部字符(包括自身)
CTRL+Y粘貼剛纔所刪除的字符
還有一些其餘的快捷鍵就再也不一一介紹了。

1七、tr 替換或刪除字符

tr [OPTION]... SET1 [SET2]

當命令tr不帶選項時表示用字符集2的字符替換字符集1內的字符:

[root@centos7 ~]# echo abc|tr a b
bbc
[root@centos7 ~]#

或轉換大小寫:

[root@centos7 ~]# echo abc|tr 'a-z' 'A-Z'
ABC
[root@centos7 ~]#

或:

[root@centos7 ~]# head -n1 /etc/passwd|tr ':' ' '
root x 0 0 root /root /bin/bash

選項-d做用是刪除SET1內的字符:

[root@centos7 ~]# echo abc|tr -d a
bc
[root@centos7 ~]#

tr也可使用通配符中支持的字符組:

[root@centos7 ~]# echo abc|tr '[:lower:]' '[:upper:]'
ABC
[root@centos7 ~]#

輸入與輸出(input/output (I/O))對一個操做系統來講很是關鍵。試想一下,若是一個程序沒有輸入,那麼每次執行它都會獲得相同的結果,若是一個程序沒有輸出,那它運行的目的是什麼。。。本文簡述了linux中輸入與輸出相關命令,舉例說明了輸入輸出重定向和管道的簡單用法,描述了shell通配符和命令行的一些使用技巧。關於重定向的更多內容,會在講bash編程的文章中繼續描述。

相關文章
相關標籤/搜索