在第一篇介紹命令行接口時,咱們是這樣描述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也會變。但當使用命令chmod
、chown
等改變文件屬性信息時,只有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 !
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中使用很是頻繁,後面還會有不少例子。
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 !
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
* ? [...] # 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
粘貼剛纔所刪除的字符
還有一些其餘的快捷鍵就再也不一一介紹了。
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編程的文章中繼續描述。