在前面,我們已經裝好了 CentOS 的虛擬機系統,並且複製了 4 臺機器,現在,我們就不直接使用 VMware 直接操作服務器虛擬機了,而是使用 Xshell 軟件。官方下載地址:https://www.netsarang.com/zh/xshell/
Xshell 軟件是一款客戶機軟件,通過SSH協議遠程訪問服務器。以後你們到公司上班的話,是見不到那些物理服務器的,你要訪問那些服務器,必須通過你公司的電腦通過網絡遠程連接,目前比較常用的就是 Xshell 軟件。
打開 Xshell,
輸入:ssh 主機名@主機IP地址 ,回車,就會讓你輸入密碼:
輸入密碼,點 確定,即遠程連接服務器成功。Xshell界面和VMware界面是一樣一樣的。
接下來進入今天的主題:開始講 Linux 命令啦
Linux 命令
1、type
type命令 用來顯示指定命令的類型,判斷給出的指令是內部指令還是外部指令。
2、file
file命令 用於辨識文件類型。通過file指令,我們得以辨識該文件的類型。
3、echo
4、man
如果在使用 man 命令時提示該命令沒有安裝,就使用 yum install man man-pages 安裝 man 命令和其幫助文檔 man-pages
5、yum
6、help
總結來說,Linux 就兩類命令,
一類是 外部命令,使用 man 來學習
一類是 內部命令,使用 help 來學習
Linux 所有的內部命令 可通過 help 直接回車得到顯示:
[root@node0001 ~]# help
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
These shell commands are defined internally. Type `help' to see this list.
Type `help name' to find out more about the function `name'.
Use `info bash' to find out more about the shell in general.
Use `man -k' or `info' to find out more about commands not in this list.
A star (*) next to a name means that the command is disabled.
job_spec [&] history [-c] [-d offset] [n] or hi>
(( expression )) if COMMANDS; then COMMANDS; [ elif>
. filename [arguments] jobs [-lnprs] [jobspec ...] or job>
: kill [-s sigspec | -n signum | -si>
[ arg... ] let arg [arg ...]
[[ expression ]] local [option] name[=value] ...
alias [-p] [name[=value] ... ] logout [n]
bg [job_spec ...] mapfile [-n count] [-O origin] [-s>
bind [-lpvsPVS] [-m keymap] [-f fil> popd [-n] [+N | -N]
break [n] printf [-v var] format [arguments]>
builtin [shell-builtin [arg ...]] pushd [-n] [+N | -N | dir]
caller [expr] pwd [-LP]
case WORD in [PATTERN [| PATTERN]..> read [-ers] [-a array] [-d delim] >
cd [-L|-P] [dir] readarray [-n count] [-O origin] [>
command [-pVv] command [arg ...] readonly [-af] [name[=value] ...] >
compgen [-abcdefgjksuv] [-o option]> return [n]
complete [-abcdefgjksuv] [-pr] [-DE> select NAME [in WORDS ... ;] do CO>
compopt [-o|+o option] [-DE] [name > set [--abefhkmnptuvxBCHP] [-o opti>
continue [n] shift [n]
coproc [NAME] command [redirections> shopt [-pqsu] [-o] [optname ...]
declare [-aAfFilrtux] [-p] [name[=v> source filename [arguments]
dirs [-clpv] [+N] [-N] suspend [-f]
disown [-h] [-ar] [jobspec ...] test [expr]
echo [-neE] [arg ...] time [-p] pipeline
enable [-a] [-dnps] [-f filename] [> times
eval [arg ...] trap [-lp] [[arg] signal_spec ...]>
exec [-cl] [-a name] [command [argu> true
exit [n] type [-afptP] name [name ...]
export [-fn] [name[=value] ...] or > typeset [-aAfFilrtux] [-p] name[=v>
false ulimit [-SHacdefilmnpqrstuvx] [lim>
fc [-e ename] [-lnr] [first] [last]> umask [-p] [-S] [mode]
fg [job_spec] unalias [-a] name [name ...]
for NAME [in WORDS ... ] ; do COMMA> unset [-f] [-v] [name ...]
for (( exp1; exp2; exp3 )); do COMM> until COMMANDS; do COMMANDS; done
function name { COMMANDS ; } or nam> variables - Names and meanings of >
getopts optstring name [arg] wait [id]
hash [-lr] [-p pathname] [-dt] [nam> while COMMANDS; do COMMANDS; done
help [-dms] [pattern ...] { COMMANDS ; }
7、whereis
----------------------- 華麗的分割線 --------------------------------
文件系統命令
1、df
Linux df命令用於顯示目前在Linux系統上的文件系統的磁盤使用情況統計。
2、du
Linux du命令用於顯示目錄或文件的大小。
du會顯示指定的目錄或文件所佔用的磁盤空間。
du == disk usage (磁盤使用量,佔用的磁盤空間)
一個文件佔用的磁盤空間和一個文件的大小是兩碼事情。佔用空間取決於文件系統的塊(block)的大小,linux一般默認是4k(4096) ,因此,一個大小爲1個字節的文件,最小也要佔用4k,如果你創建文件系統的時候制定塊大小是16K,那麼即便一個文件只有1個字節,佔用空間也是16K。
如果一個分區上主要放大文件,那麼block可以大一些,有利於減少磁盤碎片,如果主要放小文件,那麼block設置小一下,否則太浪費磁盤空間。
通常情況下,ls 顯示的文件大小比du顯示的磁盤佔用空間小,比如文件系統的block是4K,一個13K的文件佔用的空間是 13k/4k = 3.25 個block,一個block只能被一個文件佔用,因此實際佔用空間就是4個block,就是16K。
3、cd
Linux cd命令用於切換當前工作目錄至 dirName(目錄參數)。
其中 dirName 表示法可爲絕對路徑或相對路徑。若目錄名稱省略,則變換至使用者的 home 目錄 (也就是剛 login 時所在的目錄)。
另外,”~” 也表示爲 home 目錄 的意思,”.” 則是表示目前所在的目錄,”..” 則表示目前目錄位置的上一層目錄。
語法
cd [dirName]
- dirName:要切換的目標目錄。
實例
跳到 /usr/bin/ :
cd /usr/bin/
跳到自己的 home 目錄 :
cd ~
或者 cd
跳到目前目錄的上上兩層 :
cd ../..
跳到上次所在的目錄:
cd -
另外,如果當前用戶爲 root 用戶,root 用戶可以訪問其它任何用戶的 家目錄,可以通過:
cd /home/ 用戶名
另外,還可以通過(波浪線擴展):
cd ~用戶名
4、mkdir
Linux mkdir命令用於建立名稱爲 dirName 之子目錄。
語法
mkdir [-p] dirName
參數說明:
- -p 確保目錄名稱存在,不存在的就建一個。
實例
在工作目錄下,建立一個名爲 AAA 的子目錄 :
mkdir AAA
在工作目錄下的 BBB 目錄中,建立一個名爲 Test 的子目錄。 若 BBB 目錄原本不存在,則建立一個。(注:本例若不加 -p,且原本 BBB目錄不存在,則產生錯誤。)
mkdir -p BBB/Test
同時創建多個目錄,用 {} 括起來即可:
mkdir ./AAA/{1,2,3}
5、rm
Linux rm命令用於刪除一個文件或者目錄。
語法
rm [options] name...
參數:
- -i 刪除前逐一詢問確認。
- -f 即使原檔案屬性設爲唯讀,亦直接刪除,無需逐一確認。
- -r 將目錄及以下之檔案亦逐一刪除。
實例
刪除文件可以直接使用rm命令,若刪除目錄則必須配合選項”-r”,例如:
# rm test.txt rm:
是否刪除 一般文件 "test.txt"? y
# rm homework rm:
無法刪除目錄"homework": 是一個目錄
# rm -r homework rm:
是否刪除 目錄 "homework"? y
刪除當前目錄下的所有文件及目錄,命令行爲:
rm -r *
文件一旦通過rm命令刪除,則無法恢復,所以必須格外小心地使用該命令。
6、cp
Linux cp命令主要用於複製文件或目錄。
語法
cp [options] source dest
或
cp [options] source... directory
參數說明:
- -a:此選項通常在複製目錄時使用,它保留鏈接、文件屬性,並複製目錄下的所有內容。其作用等於dpR參數組合。
- -d:複製時保留鏈接。這裏所說的鏈接相當於Windows系統中的快捷方式。
- -f:覆蓋已經存在的目標文件而不給出提示。
- -i:與-f選項相反,在覆蓋目標文件之前給出提示,要求用戶確認是否覆蓋,回答”y”時目標文件將被覆蓋。
- -p:除複製文件的內容外,還把修改時間和訪問權限也複製到新文件中。
- -r:若給出的源文件是一個目錄文件,此時將複製該目錄下所有的子目錄和文件。
- -l:不復制文件,只是生成鏈接文件。
實例
使用指令”cp”將當前目錄”test/”下的所有文件複製到新目錄”newtest”下,輸入如下命令:
cp –r test/ newtest
注意:用戶使用該指令複製目錄時,必須使用參數”-r”或者”-R”
7、mv
Linux mv命令用來爲文件或目錄改名、或將文件或目錄移入其它位置。
語法
mv [options] source dest
mv [options] source... directory
參數說明:
- -i: 若指定目錄已有同名文件,則先詢問是否覆蓋舊文件;
- -f: 在mv操作要覆蓋某已有的目標文件時不給任何指示;
mv參數設置與運行結果
命令格式 | 運行結果 |
---|---|
mv 文件名 文件名 | 將源文件名改爲目標文件名 |
mv 文件名 目錄名 | 將文件移動到目標目錄 |
mv 目錄名 目錄名 | 目標目錄已存在,將源目錄 移動到目標目錄;目標 目錄不存在則改名 |
mv 目錄名 文件名 | 出錯 |
實例
將文件 aaa 更名爲 bbb :
mv aaa bbb
將info目錄放入logs目錄中。注意,如果logs目錄不存在,則該命令將info改名爲logs。
mv info/ logs
再如將/usr/student下的所有文件和目錄移到當前目錄下,命令行爲:
mv /usr/student/* .
8、ln
Linux ln命令是一個非常重要命令,它的功能是爲某一個文件在另外一個位置建立一個同步的鏈接。
當我們需要在不同的目錄,用到相同的文件時,我們不需要在每一個需要的目錄下都放一個必須相同的文件,我們只要在某個固定的目錄,放上該文件,然後在 其它的目錄下用ln命令鏈接(link)它就可以,不必重複的佔用磁盤空間。
語法
ln [參數][源文件或目錄][目標文件或目錄]
其中參數的格式爲
[-bdfinsvF] [-S backup-suffix] [-V {numbered,existing,simple}]
[–help] [–version] [–]
命令功能 :
Linux文件系統中,有所謂的鏈接(link),我們可以將其視爲檔案的別名,而鏈接又可分爲兩種 : 硬鏈接(hard link)與軟鏈接(symbolic link),硬鏈接的意思是一個檔案可以有多個名稱,而軟鏈接的方式則是產生一個特殊的檔案,該檔案的內容是指向另一個檔案的位置。硬鏈接是存在同一個文件系統中,而軟鏈接卻可以跨越不同的文件系統。
不論是硬鏈接或軟鏈接都不會將原本的檔案複製一份,只會佔用非常少量的磁碟空間。
軟鏈接:
- 1.軟鏈接,以路徑的形式存在。類似於Windows操作系統中的快捷方式
- 2.軟鏈接可以 跨文件系統 ,硬鏈接不可以
- 3.軟鏈接可以對一個不存在的文件名進行鏈接
- 4.軟鏈接可以對目錄進行鏈接
硬鏈接:
- 1.硬鏈接,以文件副本的形式存在。但不佔用實際空間。
- 2.不允許給目錄創建硬鏈接
- 3.硬鏈接只有在同一個文件系統中才能創建
命令參數
必要參數:
- -b 刪除,覆蓋以前建立的鏈接
- -d 允許超級用戶製作目錄的硬鏈接
- -f 強制執行
- -i 交互模式,文件存在則提示用戶是否覆蓋
- -n 把符號鏈接視爲一般目錄
- -s 軟鏈接(符號鏈接)
- -v 顯示詳細的處理過程
選擇參數:
- -S “-S<字尾備份字符串> “或 “–suffix=<字尾備份字符串>”
- -V “-V<備份方式>”或”–version-control=<備份方式>”
- –help 顯示幫助信息
- –version 顯示版本信息
實例
給文件創建軟鏈接,爲log2013.log文件創建軟鏈接link2013,如果log2013.log丟失,link2013將失效:
ln -s log2013.log link2013
輸出:
[root@localhost test]# ll -rw-r--r-- 1 root bin 61 11-13 06:03 log2013.log [root@localhost test]# ln -s log2013.log link2013 [root@localhost test]# ll lrwxrwxrwx 1 root root 11 12-07 16:01 link2013 -> log2013.log -rw-r--r-- 1 root bin 61 11-13 06:03 log2013.log
給文件創建硬鏈接,爲log2013.log創建硬鏈接ln2013,log2013.log與ln2013的各項屬性相同
ln log2013.log ln2013
輸出:
[root@localhost test]# ll lrwxrwxrwx 1 root root 11 12-07 16:01 link2013 -> log2013.log -rw-r--r-- 1 root bin 61 11-13 06:03 log2013.log [root@localhost test]# ln log2013.log ln2013 [root@localhost test]# ll lrwxrwxrwx 1 root root 11 12-07 16:01 link2013 -> log2013.log -rw-r--r-- 2 root bin 61 11-13 06:03 ln2013 -rw-r--r-- 2 root bin 61 11-13 06:03 log2013.log
9、stat
Linux stat命令用於顯示inode內容(常稱爲 元數據)。
stat以文字的格式來顯示inode的內容。
語法
stat [文件或目錄]
實例
查看 testfile 文件的inode內容內容,可以用以下命令:
# stat testfile
執行以上命令輸出結果:
# stat testfile #輸入命令 File: `testfile' Size: 102 Blocks: 8 IO Block: 4096 regular file Device: 807h/2055d Inode: 1265161 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2014-08-13 14:07:20.000000000 +0800 Modify: 2014-08-13 14:07:07.000000000 +0800 Change: 2014-08-13 14:07:07.000000000 +0800
10、touch
Linux touch命令用於修改文件或者目錄的時間屬性,包括存取時間和更改時間。若文件不存在,系統會建立一個新的文件。
ls -l 可以顯示檔案的時間記錄。
語法
touch [-acfm][-d<日期時間>][-r<參考文件或目錄>] [-t<日期時間>][--help][--version][文件或目錄…]
- 參數說明:
- a 改變檔案的讀取時間記錄。
- m 改變檔案的修改時間記錄。
- c 假如目的檔案不存在,不會建立新的檔案。與 –no-create 的效果一樣。
- f 不使用,是爲了與其他 unix 系統的相容性而保留。
- r 使用參考檔的時間記錄,與 –file 的效果一樣。
- d 設定時間與日期,可以使用各種不同的格式。
- t 設定檔案的時間記錄,格式與 date 指令相同。
- –no-create 不會建立新檔案。
- –help 列出指令格式。
- –version 列出版本訊息。
實例
使用指令”touch”修改文件”testfile”的時間屬性爲當前系統時間,輸入如下命令:
$ touch testfile #修改文件的時間屬性
首先,使用ls命令查看testfile文件的屬性,如下所示:
$ ls -l testfile #查看文件的時間屬性
#原來文件的修改時間爲16:09
-rw-r--r-- 1 hdd hdd 55 2019-11-15 16:09 testfile
執行指令”touch”修改文件屬性以後,並再次查看該文件的時間屬性,如下所示:
$ touch testfile #修改文件時間屬性爲當前系統時間
$ ls -l testfile #查看文件的時間屬性
#修改後文件的時間屬性爲當前系統時間
-rw-r--r-- 1 hdd hdd 55 2019-11-15 16:53 testfile
使用指令”touch”時,如果指定的文件不存在,則將創建一個新的空白文件。例如,在當前目錄下,使用該指令創建一個空白文件”file”,輸入如下命令:
$ touch file #創建一個名爲“file”的新的空白文件
11、cat
cat 命令用於連接文件並打印到標準輸出設備上。
使用權限
所有使用者
語法格式
cat [-AbeEnstTuv] [--help] [--version] fileName
參數說明:
- -n 或 –number:由 1 開始對所有輸出的行數編號。
- -b 或 –number-nonblank:和 -n 相似,只不過對於空白行不編號。
- -s 或 –squeeze-blank:當遇到有連續兩行以上的空白行,就代換爲一行的空白行。
- -v 或 –show-nonprinting:使用 ^ 和 M- 符號,除了 LFD 和 TAB 之外。
- -E 或 –show-ends : 在每行結束處顯示 $。
- -T 或 –show-tabs: 將 TAB 字符顯示爲 ^I。
- -e : 等價於 -vE。
- -A, –show-all:等價於 -vET。
- -e:等價於”-vE”選項;
- -t:等價於”-vT”選項;
實例:
把 textfile1 的文檔內容加上行號後輸入 textfile2 這個文檔裏:
cat -n textfile1 > textfile2
把 textfile1 和 textfile2 的文檔內容加上行號(空白行不加)之後將內容附加到 textfile3 文檔裏:
cat -b textfile1 textfile2 >> textfile3
清空 /etc/test.txt 文檔內容:
cat /dev/null > /etc/test.txt
cat 也可以用來製作鏡像文件。例如要製作軟盤的鏡像文件,將軟盤放好後輸入:
cat /dev/fd0 > OUTFILE
相反的,如果想把 image file 寫到軟盤,輸入:
cat IMG_FILE > /dev/fd0
注:
- 1. OUTFILE 指輸出的鏡像文件名。
- 2. IMG_FILE 指鏡像文件。
- 3. 若從鏡像文件寫回 device 時,device 容量需與相當。
- 4. 通常用製作開機磁片。
12、more
Linux more 命令類似 cat ,不過會以一頁一頁的形式顯示,更方便使用者逐頁閱讀,而最基本的指令就是按空白鍵(space)就往下一頁顯示,按 b 鍵就會往回(back)一頁顯示,而且還有搜尋字串的功能(與 vi 相似),使用中的說明文件,請按 h 。
語法
more [-dlfpcsu] [-num] [+/pattern] [+linenum] [fileNames..]
參數:
- -num 一次顯示的行數
- -d 提示使用者,在畫面下方顯示 [Press space to continue, ‘q’ to quit.] ,如果使用者按錯鍵,則會顯示 [Press ‘h’ for instructions.] 而不是 ‘嗶’ 聲
- -l 取消遇見特殊字元 ^L(送紙字元)時會暫停的功能
- -f 計算行數時,以實際上的行數,而非自動換行過後的行數(有些單行字數太長的會被擴展爲兩行或兩行以上)
- -p 不以捲動的方式顯示每一頁,而是先清除螢幕後再顯示內容
- -c 跟 -p 相似,不同的是先顯示內容再清除其他舊資料
- -s 當遇到有連續兩行以上的空白行,就代換爲一行的空白行
- -u 不顯示下引號 (根據環境變數 TERM 指定的 terminal 而有所不同)
- +/pattern 在每個文檔顯示前搜尋該字串(pattern),然後從該字串之後開始顯示
- +num 從第 num 行開始顯示
- fileNames 欲顯示內容的文檔,可爲複數個數
實例
逐頁顯示 testfile 文檔內容,如有連續兩行以上空白行則以一行空白行顯示。
more -s testfile
從第 20 行開始顯示 testfile 之文檔內容。
more +20 testfile
常用操作命令
- Enter 向下n行,需要定義。默認爲1行
- Ctrl+F 向下滾動一屏
- 空格鍵 向下滾動一屏
- Ctrl+B 返回上一屏
- = 輸出當前行的行號
- :f 輸出文件名和當前行的行號
- V 調用vi編輯器
- !命令 調用Shell,並執行命令
- q 退出more
13、less
less 與 more 類似,但使用 less 可以隨意瀏覽文件,而 more 僅能向前移動,卻不能向後移動,而且 less 在查看之前不會加載整個文件。
語法
less [參數] 文件
參數說明:
- -b <緩衝區大小> 設置緩衝區的大小
- -e 當文件顯示結束後,自動離開
- -f 強迫打開特殊文件,例如外圍設備代號、目錄和二進制文件
- -g 只標誌最後搜索的關鍵詞
- -i 忽略搜索時的大小寫
- -m 顯示類似more命令的百分比
- -N 顯示每行的行號
- -o <文件名> 將less 輸出的內容在指定文件中保存起來
- -Q 不使用警告音
- -s 顯示連續空行爲一行
- -S 行過長時間將超出部分捨棄
- -x <數字> 將”tab”鍵顯示爲規定的數字空格
- /字符串:向下搜索”字符串”的功能
- ?字符串:向上搜索”字符串”的功能
- n:重複前一個搜索(與 / 或 ? 有關)
- N:反向重複前一個搜索(與 / 或 ? 有關)
- b 向後翻一頁
- d 向後翻半頁
- h 顯示幫助界面
- Q 退出less 命令
- u 向前滾動半頁
- y 向前滾動一行
- 空格鍵 滾動一行
- 回車鍵 滾動一頁
- [pagedown]: 向下翻動一頁
- [pageup]: 向上翻動一頁
實例
1、查看文件
less log2013.log
2、ps查看進程信息並通過less分頁顯示
ps -ef |less
3、查看命令歷史使用記錄並通過less分頁顯示
history | less
4、瀏覽多個文件
less log2013.log log2014.log
說明:
輸入 :n後,切換到 log2014.log
輸入 :p 後,切換到log2013.log
附加備註
1.全屏導航
- ctrl + F – 向前移動一屏
- ctrl + B – 向後移動一屏
- ctrl + D – 向前移動半屏
- ctrl + U – 向後移動半屏
2.單行導航
- j – 向前移動一行
- k – 向後移動一行
3.其它導航
- G – 移動到最後一行
- g – 移動到第一行
- q / ZZ – 退出 less 命令
4.其它有用的命令
- v – 使用配置的編輯器編輯當前文件
- h – 顯示 less 的幫助文檔
- &pattern – 僅顯示匹配模式的行,而不是整個文件
5.標記導航
當使用 less 查看大文件時,可以在任何一個位置作標記,可以通過命令導航到標有特定標記的文本位置:
- ma – 使用 a 標記文本的當前位置
- ‘a – 導航到標記 a 處
14、head
在屏幕上顯示指定文件的開頭若干行
補充說明
head命令 用於顯示文件的開頭的內容。在默認情況下,head命令顯示文件的頭10行內容。
語法
head(選項)(參數)
選項
- -n<數字>:指定顯示頭部內容的行數;
- -c<字符數>:指定顯示頭部內容的字符數;
- -v:總是顯示文件名的頭信息;
- -q:不顯示文件名的頭信息。
參數
文件列表:指定顯示頭部內容的文件列表。
15、tail
在屏幕上顯示指定文件的末尾若干行
補充說明
tail命令 用於輸入文件中的尾部內容。tail命令默認在屏幕上顯示指定文件的末尾10行。如果給定的文件不止一個,則在顯示的每個文件前面加一個文件名標題。如果沒有指定文件或者文件名爲“-”,則讀取標準輸入。
注意:如果表示字節或行數的N值之前有一個”+”號,則從文件開頭的第N項開始顯示,而不是顯示文件的最後N項。N值後面可以有後綴:b表示512,k表示1024,m表示1 048576(1M)。
語法
tail(選項)(參數)
選項
--retry:即是在tail命令啓動時,文件不可訪問或者文件稍後變得不可訪問,都始終嘗試打開文件。使用此選項時需要與選項“——follow=name”連用;
-c<N>或——bytes=<N>:輸出文件尾部的N(N爲整數)個字節內容;
-f<name/descriptor>或;--follow<nameldescript>:顯示文件最新追加的內容。“name”表示以文件名的方式監視文件的變化。“-f”與“-fdescriptor”等效;
-F:與選項“-follow=name”和“--retry"連用時功能相同;
-n<N>或——line=<N>:輸出文件的尾部N(N位數字)行內容。
--pid=<進程號>:與“-f”選項連用,當指定的進程號的進程終止後,自動退出tail命令;
-q或——quiet或——silent:當有多個文件參數時,不輸出各個文件名;
-s<秒數>或——sleep-interal=<秒數>:與“-f”選項連用,指定監視文件變化時間隔的秒數;
-v或——verbose:當有多個文件參數時,總是輸出各個文件名;
--help:顯示指令的幫助信息;
--version:顯示指令的版本信息。
參數
文件列表:指定要顯示尾部內容的文件列表。
實例
tail file (顯示文件file的最後10行)
tail +20 file (顯示文件file的內容,從第20行至文件末尾)
tail -c 10 file (顯示文件file的最後10個字符)
16、管道 |
簡單來說,管道就是把前一個命令的結果當成後一個命令的輸入。
管道是由內核管理的一個緩衝區,相當於我們放入內存中的一個紙條。管道的一端連接一個進程的輸出。這個進程會向管道中放入信息。管道的另一端連接一個進程的輸入,這個進程取出被放入管道的信息。一個緩衝區不需要很大,它被設計成爲環形的數據結構,以便管道可以被循環利用。當管道中沒有信息的話,從管道中讀取的進程會等待,直到另一端的進程放入信息。當管道被放滿信息的時候,嘗試放入信息的進程會堵塞,直到另一端的進程取出信息。當兩個進程都終結的時候,管道也自動消失。
實例:
查看 a.txt 文件5-10行的內容
# 在前面的 head 和 tail 命令中,只能顯示前面或後面的連續內容,如果想顯示中間的部分內容,就可以使用管道
head -n10 a.txt | tail -n5
查詢帶有關鍵字 python 的進程,一條一條列出。
ps -ef | grep python
17、grep
Linux grep命令用於查找文件裏符合條件的字符串。
grep指令用於查找內容包含指定的範本樣式的文件,如果發現某文件的內容符合所指定的範本樣式,預設grep指令會把含有範本樣式的那一列顯示出來。若不指定任何文件名稱,或是所給予的文件名爲”-“,則grep指令會從標準輸入設備讀取數據。
語法
grep [-abcEFGhHilLnqrsvVwxy][-A<顯示列數>][-B<顯示列數>][-C<顯示列數>][-d<進行動作>][-e<範本樣式>][-f<範本文件>][--help][範本樣式][文件或目錄...]
參數:
- -a或–text 不要忽略二進制的數據。
- -A<顯示列數>或–after-context=<顯示列數> 除了顯示符合範本樣式的那一列之外,並顯示該列之後的內容。
- -b或–byte-offset 在顯示符合範本樣式的那一列之前,標示出該列第一個字符的位編號。
- -B<顯示列數>或–before-context=<顯示列數> 除了顯示符合範本樣式的那一列之外,並顯示該列之前的內容。
- -c或–count 計算符合範本樣式的列數。
- -C<顯示列數>或–context=<顯示列數>或-<顯示列數> 除了顯示符合範本樣式的那一列之外,並顯示該列之前後的內容。
- -d<進行動作>或–directories=<進行動作> 當指定要查找的是目錄而非文件時,必須使用這項參數,否則grep指令將回報信息並停止動作。
- -e<範本樣式>或–regexp=<範本樣式> 指定字符串做爲查找文件內容的範本樣式。
- -E或–extended-regexp 將範本樣式爲延伸的普通表示法來使用。
- -f<範本文件>或–file=<範本文件> 指定範本文件,其內容含有一個或多個範本樣式,讓grep查找符合範本條件的文件內容,格式爲每列一個範本樣式。
- -F或–fixed-regexp 將範本樣式視爲固定字符串的列表。
- -G或–basic-regexp 將範本樣式視爲普通的表示法來使用。
- -h或–no-filename 在顯示符合範本樣式的那一列之前,不標示該列所屬的文件名稱。
- -H或–with-filename 在顯示符合範本樣式的那一列之前,表示該列所屬的文件名稱。
- -i或–ignore-case 忽略字符大小寫的差別。
- -l或–file-with-matches 列出文件內容符合指定的範本樣式的文件名稱。
- -L或–files-without-match 列出文件內容不符合指定的範本樣式的文件名稱。
- -n或–line-number 在顯示符合範本樣式的那一列之前,標示出該列的列數編號。
- -q或–quiet或–silent 不顯示任何信息。
- -r或–recursive 此參數的效果和指定”-d recurse”參數相同。
- -s或–no-messages 不顯示錯誤信息。
- -v或–revert-match 反轉查找。
- -V或–version 顯示版本信息。
- -w或–word-regexp 只顯示全字符合的列。
- -x或–line-regexp 只顯示全列符合的列。
- -y 此參數的效果和指定”-i”參數相同。
- –help 在線幫助。
實例
1、在當前目錄中,查找後綴有”test”字樣的文件中包含”test”字符串的文件,並打印出該字符串的行。此時,可以使用如下命令:
grep test *file
結果如下所示:
$ grep test test* #查找後綴有“test”的文件包含“test”字符串的文件 testfile1:This a Linux testfile! #列出testfile1 文件中包含test字符的行 testfile_2:This is a linux testfile! #列出testfile_2 文件中包含test字符的行 testfile_2:Linux test #列出testfile_2 文件中包含test字符的行
2、以遞歸的方式查找符合條件的文件。例如,查找指定目錄/etc/acpi 及其子目錄(如果存在子目錄的話)下所有文件中包含字符串”update”的文件,並打印出該字符串所在行的內容,使用的命令爲:
grep -r update /etc/acpi
輸出結果如下:
$ grep -r update /etc/acpi #以遞歸的方式查找“etc/acpi” #下包含“update”的文件 /etc/acpi/ac.d/85-anacron.sh:# (Things like the slocate updatedb cause a lot of IO.) Rather than /etc/acpi/resume.d/85-anacron.sh:# (Things like the slocate updatedb cause a lot of IO.) Rather than /etc/acpi/events/thinkpad-cmos:action=/usr/sbin/thinkpad-keys--update
3、反向查找。前面各個例子是查找並打印出符合條件的行,通過”-v”參數可以打印出不符合條件行的內容。
查找文件名中包含test 的文件中不包含test 的行,此時,使用的命令爲:
grep -v test*
結果如下所示:
$ grep-v test* #查找文件名中包含test 的文件中不包含test 的行 testfile1:helLinux! testfile1:Linis a free Unix-type operating system. testfile1:Lin testfile_1:HELLO LINUX! testfile_1:LINUX IS A FREE UNIX-TYPE OPTERATING SYSTEM. testfile_1:THIS IS A LINUX TESTFILE! testfile_2:HELLO LINUX! testfile_2:Linux is a free unix-type opterating system.
18、xargs
給其他命令傳遞參數的一個過濾器
補充說明
xargs命令 是給其他命令傳遞參數的一個過濾器,也是組合多個命令的一個工具。它擅長將標準輸入數據轉換成命令行參數,xargs能夠處理管道或者stdin並將其轉 換成特定命令的命令參數。xargs也可以將單行或多行文本輸入轉換爲其他格式,例如多行變單行,單行變多行。xargs的默認命令是echo,空格是默 認定界符。這意味着通過管道傳遞給xargs的輸入將會包含換行和空白,不過通過xargs的處理,換行和空白將被空格取代。xargs是構建單行命令的 重要組件之一。
xargs命令用法
xargs用作替換工具,讀取輸入數據重新格式化後輸出。
定義一個測試文件,內有多行文本數據:
cat test.txt
a b c d e f g
h i j k l m n
o p q
r s t
u v w x y z
多行輸入單行輸出:
cat test.txt | xargs
a b c d e f g h i j k l m n o p q r s t u v w x y z
-n選項 多行輸出:
cat test.txt | xargs -n3
a b c
d e f
g h i
j k l
m n o
p q r
s t u
v w x
y z
-d選項 可以自定義一個定界符:
echo "nameXnameXnameXname" | xargs -dX
name name name name
結合 -n選項 使用:
echo "nameXnameXnameXname" | xargs -dX -n2
name name
name name
讀取stdin,將格式化後的參數傳遞給命令
假設一個命令爲 sk.sh 和一個保存參數的文件arg.txt:
#!/bin/bash
#sk.sh命令內容,打印出所有參數。
echo $*
arg.txt文件內容:
cat arg.txt
aaa
bbb
ccc
xargs的一個 選項-I ,使用-I指定一個替換字符串{},這個字符串在xargs擴展時會被替換掉,當-I與xargs結合使用,每一個參數命令都會被執行一次:
cat arg.txt | xargs -I {} ./sk.sh -p {} -l
-p aaa -l
-p bbb -l
-p ccc -l
複製所有圖片文件到 /data/images 目錄下:
ls *.jpg | xargs -n1 -I cp {} /data/images
xargs結合find使用
用rm 刪除太多的文件時候,可能得到一個錯誤信息:/bin/rm Argument list too long. 用xargs去避免這個問題:
find . -type f -name "*.log" -print0 | xargs -0 rm -f
xargs -0將\0作爲定界符。
統計一個源代碼目錄中所有php文件的行數:
find . -type f -name "*.php" -print0 | xargs -0 wc -l
查找所有的jpg 文件,並且壓縮它們:
find . -type f -name "*.jpg" -print | xargs tar -czvf images.tar.gz
xargs其他應用
假如你有一個文件包含了很多你希望下載的URL,你能夠使用xargs下載所有鏈接:
cat url-list.txt | xargs wget -c
子Shell(Subshells)
運行一個 shell腳本時會啓動另一個命令解釋器.,就好像你的命令是在命令行提示下被解釋的一樣,類似於批處理文件裏的一系列命令。每個shell腳本有效地運 行在父shell(parent shell)的一個子進程裏。這個父shell是指在一個控制終端或在一個xterm窗口中給你命令指示符的進程。
cmd1 | ( cmd2; cmd3; cmd4 ) | cmd5
如果cmd2 是cd /,那麼就會改變子Shell的工作目錄,這種改變只是侷限於子shell內部,cmd5則完全不知道工作目錄發生的變化。子shell是嵌在圓括號()內部的命令序列,子Shell內部定義的變量爲局部變量。
子shell可用於爲一組命令設定臨時的環境變量:
COMMAND1
COMMAND2
COMMAND3
(
IFS=:
PATH=/bin
unset TERMINFO
set -C
shift 5
COMMAND4
COMMAND5
exit 3 # 只是從子shell退出。
)
# 父shell不受影響,變量值沒有更改。
COMMAND6
COMMAND7
echo / | xargs ls -ll
[root@node0001 ~]# echo /
/
[root@node0001 ~]# echo / | xargs ls -ll
total 94
dr-xr-xr-x. 2 root root 4096 Oct 23 02:59 bin
dr-xr-xr-x. 5 root root 1024 Oct 23 03:00 boot
drwxr-xr-x 18 root root 3700 Nov 15 16:36 dev
drwxr-xr-x. 61 root root 4096 Nov 15 16:36 etc
drwxr-xr-x. 2 root root 4096 Sep 23 2011 home
dr-xr-xr-x. 8 root root 4096 Oct 23 02:59 lib
dr-xr-xr-x. 9 root root 12288 Oct 23 03:00 lib64
drwx------. 2 root root 16384 Oct 23 02:58 lost+found
drwxr-xr-x. 2 root root 4096 Sep 23 2011 media
drwxr-xr-x. 2 root root 4096 Sep 23 2011 mnt
drwxr-xr-x. 2 root root 4096 Sep 23 2011 opt
dr-xr-xr-x 86 root root 0 Nov 15 16:36 proc
dr-xr-x---. 2 root root 4096 Nov 15 17:33 root
dr-xr-xr-x. 2 root root 12288 Oct 23 03:00 sbin
drwxr-xr-x. 2 root root 4096 Oct 23 02:59 selinux
drwxr-xr-x. 2 root root 4096 Sep 23 2011 srv
drwxr-xr-x 13 root root 0 Nov 15 16:36 sys
drwxrwxrwt. 3 root root 4096 Nov 15 16:36 tmp
drwxr-xr-x. 13 root root 4096 Oct 23 02:59 usr
drwxr-xr-x. 17 root root 4096 Oct 23 02:59 var