基本命令node
ls : "列出"文件的基本命令. 可是每每就是由於這個命令太簡單, 因此咱們老是低估它. 好比, 使用-R選項, 遞歸選項, ls將會以目錄樹的形式列出全部文件. 另外一個頗有用的選項-S, 將會按照文件尺寸列出全部文件, -t, 將會按照修改時間來列出文件, -i選項會顯示文件的inode。正則表達式
cat, tac : cat, 是單詞concatenate的縮寫, 把文件的內容輸出到stdout. 當與重定向操做符(>或>>), 通常都是用來將多個文件鏈接起來.shell
cat命令的-n選項是爲了在目標文件中的全部行前邊插入行號. -b也是用來加行號的, 可是不對空行進行編號. -v選項可使用^標記法來echo出不可打印字符. -s選項能夠把多個空行壓縮成一個空行. 在一個管道中, 有一種把stdin重定向到一個文件中更有效的方法, 這種方法比使用cat文件的方法更高效.數據庫
cat filename | tr a-z A-Z tr a-z A-Z < filename # 效果相同, 可是處理更少,而且連管道都省掉了express
tac命令, 就是cat命令的反轉, 這個命令將會從文件結尾部分列出文件的內容.反向cat。編程
rev : 把每一行中的內容反轉, 而且輸出到stdout上. 這個命令與tac命令的效果是不一樣的, 由於它並不反轉行序, 而是把每行的內容反轉.安全
cp : 這是文件拷貝命令. cp file1 file2把文件file1拷貝到file2, 若是file2存在的話, 那麼file2將被覆蓋。 特別有用的選項就是-a選項, 這是歸檔標誌(目的是爲了copy一個完整的目錄樹), -u是更新選項, -r和-R選項是遞歸標誌.bash
cp -u source_dir/* dest_dir # 把源目錄"同步"到目標目錄上, 也就是拷貝全部更新的文件和以前不存在的文件.服務器
mv : 這是文件移動命令. 它等價於cp和rm命令的組合. 它能夠把多個文件移動到目錄中,甚 至將目錄重命名.當使用非交互腳本時, 可使用mv的-f(強制)選項來避免用戶的輸入.當一個目錄被移動到一個已存在的目錄時, 那麼它將成爲目標目錄的子目錄.網絡
rm : 刪除(清除)一個或多個文件. -f選項將強制刪除文件, 即便這個文件是隻讀的. 而且能夠用來避免用戶輸入(在非交互腳本中使用). 當使用遞歸參數-r時, 這個命令將會刪除整個目錄樹. 若是不慎的使用rm -rf *的話, 那整個目錄樹就真的完了.
rm將沒法刪除以破折號開頭的文件.解決這個問題的一個方法就是在要刪除的文件的前邊加上./。另外一種解決的方法是在文件名前邊加上" -- ". rm ./-badname 。 rm -- -badname
rmdir : 刪除目錄. 可是隻有這個目錄中沒有文件的時候 -- 固然會包含"不可見的"點文件 -- 這個命令纔會成功.
mkdir : 生成目錄, 建立一個空目錄. 好比, mkdir -p project/programs/December將會建立指定的目錄,即便project目錄和programs目錄都不存在. -p選項將會自動產生必要的父目錄, 這樣也就同時建立了多個目錄.
chmod : 修改一個現存文件的屬性。 chmod +x filename , chmod 644 filename
ln : 建立文件連接, 前提是這個文件是存在的. "連接"就是一個文件的引用, 也就是這個文件的另外一個名字. ln命令容許對同一個文件引用多個連接, 而且是避免混淆的一個很好的方法。 ln對於文件來講只不過是建立了一個引用, 一個指針而已, 由於建立出來的鏈接文件只有幾個字節.
絕大多數使用ln命令時, 使用的是-s選項, 能夠稱爲符號連接, 或"軟"連接. 使用-s標誌的一個優勢是它能夠穿越文件系統來連接目錄. 關於使用這個命令的語法仍是有點小技巧的. 好比: ln -s oldfile newfile將對以前存在的oldfile產生一個新的鏈接, newfile.若是以前newfile已經存在的話, 將會產生一個錯誤信息.
不管是那種類型的連接, 都提供了一種雙向引用的手段 -- 也就是說, 無論你用文件的哪一個名字對文件內容進行修改, 你修改的效果都即會影響到原始名字的文件, 也會影響到連接名字的文件. 當你工做在更高層次的時候, 纔會發生軟硬連接的不一樣. 硬連接的優勢是, 原始文件與連接文件之間是相互獨立的 -- 若是你刪除或者重命名舊文件, 那麼這種操做將不會影響硬連接的文件, 硬連接的文件講仍是原來文件的內容. 然而若是你使用軟連接的話, 當你把舊文件刪除或重命名後, 軟連接將再也找不到原來文件的內容了. 而軟連接的優勢是它能夠跨越文件系統(由於它只不過是文件名的一個引用, 而並非真正的數據). 與硬連接的另外一個不一樣是, 一個符號連接能夠指向一個目錄.
man, info : 這兩個命令用來查看系統命令或安裝工具的手冊和信息. 當二者均可用時, info頁通常會比man頁包含更多的細節描述.
複雜命令
find
-exec COMMAND \; 在每個find匹配到的文件執行COMMAND命令. 命令序列以;結束(";"是轉義符以保證shll傳遞到find命令中的字符不會被解釋爲其餘的特殊字符).若是COMMAND中包含{}, 那麼find命令將會用全部匹配文件的路徑名來替換"{}". find命令的-exec選項不該該與shell中的內建命令exec相混淆.
find ~/ -name 'core*' -exec rm {} \; # 從用戶的 home 目錄中刪除全部的 core dump文件.
find /home/bozo/projects -mtime 1 # 列出最後一天被修改的 # mtime = 目標文件最後修改的時間 # ctime = 修改後的最後狀態(經過'chmod'或其餘方法) # atime = 最後訪問時間
find "$DIR" -type f -atime +5 -exec rm {} \; 刪除至少5天內沒被訪問過的 "/home/bozo/junk_files" 中的全部文件.
expr : 通用求值表達式: 經過給定的操做(參數必須以空格分開)鏈接參數, 並對參數求值. 可使算術操做, 比較操做, 字符串操做或者是邏輯操做.
expr 5 \* 3 #返回15, 在算術表達式expr中使用乘法操做時, 乘法符號必須被轉義.
y=`expr $y + 1` 增長變量的值, 與let y=y+1和y=$(($y+1))的效果相同. 這是使用算術表達式的一個例子.
z=`expr substr $string $position $length` 在位置$position上提取$length長度的子串.
:操做能夠替換match命令. 好比, b=`expr $a : [0-9]*`與b=`expr match $a [0-9]*`徹底等價.
時間/日期 命令
date : 直接調用date命令就會把日期和時間輸出到 stdout上. 這個命令有趣的地方在於它的格式化和分析選項上. 須要在調用格式的前邊加上一個'+'號.
date +%j # %j用來給出今天是本年度的第幾天.
%s將產生從"UNIX 元年"到如今爲止的秒數。suffix=$(date +%s) , filename=$prefix.$suffix # 這是一種很是好的產生"惟一"臨時文件的辦法,甚至比使用$$都強.
SixDaysAgo=$(date --date='6 days ago') OneWeekAgo=$(date --date='1 week ago') OneMonthAgo=$(date --date='1 month ago') # 四周前(不是一個月). OneYearAgo=$(date --date='1 year ago')
touch : 這是一個用來更新文件被訪問或修改的時間的工具, 這個時間能夠是當前系統的時間,也能夠是指定的時間, 這個命令也用來產生一個新文件. 命令touch zzz將產生一個zzz爲名字的0字節長度文件, 固然前提是zzz文件不存在. 爲了存儲時間信息, 就須要一個時間戳爲空的文件, 好比當你想跟蹤一個工程的修改時間的時候, 這就很是有用了.
at : at命令是一個做業控制命令, 用來在指定時間點上執行指定的命令集合. 它有點像cron命令, 然而, at命令主要仍是用來執行那種一次性執行的命令集合. 你可使用-f選項或者使用(<)重定向操做符, 來讓at命令從一個文件中讀取命令集合. 這個文件其實就一個可執行的的腳本, 雖然它是一個不可交互的腳本。 at 2:30 am Friday < at-jobs.list
cal : 從stdout中輸出一個格式比較整齊的日曆. 既能夠指定當前年度, 也能夠指定過去或未來的某個年度.
sleep :這個命令與一個等待循環的效果同樣. 你能夠指定須要暫停的秒數, 這段時間將什麼都不幹。 sleep 3 # 暫停3秒。sleep默認是以秒爲單位, 可是你也能夠指定分鐘, 小時, 或者天數爲單位. sleep 3 h # 暫停3小時! 若是你想每隔一段時間來運行一個命令的話, 那麼watch命令將比sleep命令好得多.
文本處理命令
sort : 文件排序, 一般用在管道中當過濾器來使用. 這個命令能夠依據指定的關鍵字或指定的字符位置, 對文件行進行排序. 使用-m選項, 它將會合並預排序的輸入文件. 想了解這個命令的所有參數請參考這個命令的info頁.
tsort : 拓撲排序, 讀取以空格分隔的有序對, 而且依靠輸入模式進行排序.
uniq :這個過濾器將會刪除一個已排序文件中的重複行. 這個命令常常出如今sort命令的管道後邊.
cat list-1 list-2 list-3 | sort | uniq > final.list # 將3個文件鏈接起來, 將它們排序, 刪除其中重複的行,最後將結果重定向到一個文件中.
-c用來統計每行出現的次數, 並把次數做爲前綴放到輸出行的前面.
sort INPUTFILE | uniq -c | sort -nr 命令先對INPUTFILE文件進行排序, 而後統計每行出現的次數(sort命令的-nr選項會產生一個數字的反轉排序). 這種命令模板通常都用來分析log文件或者用來分析字典列表, 或者用在那些須要檢查文本詞彙結構的地方.
sed -e 's/\.//g' -e 's/\,//g' -e 's/ /\
/g' "$1" | tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr # 過濾掉句號和逗號, 而且把單詞間的空格轉化爲換行, 而後轉化爲小寫, 最後統計單詞出現的頻率並按頻率排序.
expand, unexpand : expand命令將會把每一個tab轉化爲一個空格. 這個命令常常用在管道中.unexpand命令將會把每一個空格轉化爲一個tab. 效果與expand命令相反.
cut : 一個從文件中提取特定域的工具. 這個命令與awk中使用的print $N命令很類似, 可是更受限. 在腳本中使用cut命令會比使用awk命令來得容易一些. 最重要的選項就是-d(字段定界符)和-f(域分隔符)選項.
cut -d ' ' -f1,2 /etc/mtab
paste : 將多個文件, 以每一個文件一列的形式合併到一個文件中, 合併後文件中的每一列就是原來的一個文件.與cut結合使用, 常常用於建立系統log文件.
join : 這個命令與paste命令屬於同類命令. 可是它可以完成某些特殊的目地. 這個強力工具可以以一種特殊的形式來合併兩個文件, 這種特殊的形式本質上就是一個關聯數據庫的簡單版本.join命令只可以操做兩個文件. 它能夠將那些具備特定標記域(一般是一個數字標籤)的行合併起來, 而且將結果輸出到stdout. 被加入的文件應該事先根據標記域進行排序以便於可以正確的匹配.
head : 把文件的頭部內容打印到stdout上(默認爲10行, 能夠本身修改). 這個命令有一些比較有趣的選項.
tail : 將一個文件結尾部分的內容輸出到stdout中(默認爲10行). 一般用來跟蹤一個系統logfile的修改狀況,若是使用-f選項的話, 這個命令將會繼續顯示添加到文件中的行.
爲了列出一個文本文件中的指定行的內容, 能夠將head命令的輸出經過管道傳遞到tail -1中. 好比head -8 database.txt | tail -1將會列出database.txt文件第8行的內容.
var=$(head -$m $filename | tail -$n) # filename = 文件名 # m = 從文件開頭到塊結尾的行數 # n = 想保存到變量中的指定行數(從塊結尾開始截斷)
grep : 使用正則表達式的一個多用途文本搜索工具. 這個命令原本是ed行編輯器中的一個命令/過濾器: g/re/p -- global - regular expression - print.
grep pattern [file...] 在文件中搜索全部pattern出現的位置, pattern既能夠是要搜索的字符串, 也能夠是一個正則表達式.
grep '[rst]ystem.$' osinfo.txt #Linux operating system. #若是沒有指定文件參數, grep一般用在管道中對stdout進行過濾.
-i 選項在搜索時忽略大小寫. -w 選項用來匹配整個單詞. -l 選項僅列出符合匹配的文件, 而不列出匹配行. -r (遞歸) 選項不只在當前工做目錄下搜索匹配, 並且搜索子目錄. -n 選項列出全部匹配行, 並顯示行號. -v (或者--invert-match)選項將會顯示全部不匹配的行. -c (--count) 選項將只會顯示匹配到的行數的總數,而不會列出具體的匹配.
grep -n Linux osinfo.txt #6: Linux operating system.
若是存在一個成功的匹配, 那麼grep命令將會返回0做爲退出狀態碼, 這樣就能夠將grep命令的結果放在腳本的條件測試中來使用, 尤爲和-q(禁止輸出)選項組合時特別有用. grep -q "$word" "$filename" # "-q"選項將使得什麼都不輸出到stdout上.
egrep - 擴展的grep - 這個命令與grep -E等價. 這個命令用起來有些不一樣, 因爲使用正則表達式的擴展集合, 將會使得搜索更具靈活性. 它也容許邏輯|(或)操做. egrep 'matches|Matches' file.txt
fgrep - 快速的grep - 這個命令與grep -F等價. 這是一種按照字符串字面意思進行的搜索(即不容許使用正則表達式), 這樣有時候會使搜索變得容易一些.
look :look命令與grep命令很類似, 可是這個命令只能作"字典查詢", 也就是它所搜索的文件必須是已經排過序的單詞列表. 默認狀況下, 若是沒有指定搜索哪一個文件, look命令就默認搜索/usr/dict/words(譯者:感受好像應該是/usr/share/dict/words), 固然也能夠指定其餘目錄下的文件進行搜索.
sed, awk :這個兩個命令都是獨立的腳本語言, 尤爲適合分析文本文件和命令輸出. 既能夠單獨使用, 也能夠結合管道和在shell腳本中使用.
sed : 非交互式的"流編輯器", 在批處理模式下, 容許使用多個ex命令. 你會發現它在shell腳本中很是有用.
awk : 可編程的文件提取器和文件格式化工具, 在結構化的文本文件中, 處理或提取特定域(特定列)具備很是好的表現. 它的語法與C語言很相似.
wc : wc能夠統計文件或I/O流中的"單詞數量":
wc -w 統計單詞數量. wc -l 統計行數量. wc -c 統計字節數量.wc -m 統計字符數量.wc -L 給出文件中最長行的長度.
ls *.txt | wc -l #由於列出的文件名都是以換行符區分的, 因此使用-l來統計.
tr : 字符轉換過濾器. 必須使用引用或中括號, 這樣作纔是合理的. 引用能夠阻止shell從新解釋出如今tr命令序列中的特殊字符. 中括號應該被引用起來防止被shell擴展.
不管tr "A-Z" "*" <filename仍是tr A-Z \* <filename均可以將filename中的大寫字符修改成星號(寫到stdout). 可是在某些系統上可能就不能正常工做了, 而tr A-Z '[**]'在任何系統上均可以正常工做.
-d選項刪除指定範圍的字符. echo "abcdef" | tr -d b-d # aef . tr -d 0-9 <filename # 刪除"filename"中全部的數字.
--squeeze-repeats (或-s)選項用來在重複字符序列中除去除第一個字符之外的全部字符. 這個選項在刪除多餘空白的時候很是有用. echo "XXXXX" | tr --squeeze-repeats 'X' # X
-c"complement"選項將會反轉匹配的字符集. 經過這個選項, tr將只會對那些不匹配的字符起做用. echo "acfdeb123" | tr -c b-d + # +c+d+b++++
tr a-z A-Z <"$1" , tr '[:lower:]' '[:upper:]' <"$1" 所有轉換爲大寫.
tr 'a-zA-Z' 'n-za-mN-ZA-M' # "a"變爲"n", "b"變爲"o", 等等.
fold : 將輸入按照指定寬度進行折行. 這裏有一個很是有用的選項-s, 這個選項可使用空格進行斷行(譯者:事實上只有外文才須要使用空格斷行, 中文是不須要的)
fmt : 一個簡單的文件格式器, 一般用在管道中, 將一個比較長的文本行輸出進行"折行". fmt -w $WIDTH
col : 這個命令用來濾除標準輸入的反向換行符號. 這個工具還能夠將空白用等價的tab來替換. col工具最主要的應用仍是從特定的文本處理工具中過濾輸出, 好比groff和tbl.
column : 列格式化工具. 經過在合適的位置插入tab, 這個過濾工具會將列類型的文本轉化爲"易於打印"的表格式進行輸出.
ls -l | sed 1d) | column -t # 管道中的"sed 1d"刪除輸出的第一行, "column"中的-t選項用來轉化爲易於打印的表形式.
colrm : 列刪除過濾器. 這個工具將會從文件中刪除指定的列(列中的字符串)而且寫到文件中, 若是指定的列不存在, 那麼就回到stdout. colrm 2 4 <filename將會刪除filename文件中每行的第2到第4列之間的全部字符. 若是這個文件包含tab和不可打印字符, 那將會引發不可預期的行爲. 在這種狀況下, 應該經過管道的手段使用expand和unexpand來預處理colrm.
nl : 計算行號過濾器. nl filename將會把filename文件的全部內容都輸出到stdout上, 可是會在每一個非空行的前面加上連續的行號. 若是沒有filename參數, 那麼就操做stdin.nl命令的輸出與cat -n很是類似, 然而, 默認狀況下nl不會列出空行.
通信命令
host : 經過名字或IP地址來搜索一個互聯網主機的信息, 使用DNS. bash$ host surfacemail.com #host ip surfacemail.com. has address 202.92.42.236 ipcalc: 顯示一個主機IP信息. 使用-h選項, ipcalc將會作一個DNS的反向查詢, 經過IP地址找到主機(服務器)名. bash$ ipcalc -h 202.92.42.236 HOSTNAME=surfacemail.com nslookup : 經過IP地址在一個主機上作一個互聯網的"名字服務查詢". 事實上, 這與ipcalc -h或dig -x等價. 這個命令既能夠交互運行也能夠非交互運行, 換句話說, 就是在腳本中運行.nslookup命令聽說已經被慢慢的"忽視"了, 但事實上它是有必定的做用. bash$ nslookup -sil 66.97.104.180 nslookup kuhleersparnis.ch Server: 135.116.137.2 Address: 135.116.137.2#53 Non-authoritative answer: Name: kuhleersparnis.ch dig : Domain Information Groper(域信息查詢). 與nslookup很類似, dig也能夠在一個主機上作互聯網的"名字服務查詢". 這個命令既能夠交互運行也能夠非交互運行, 換句話說, 就是在腳本中運行. 下面是一些dig命令有趣的選項, +time=N選項用來設置查詢超時爲N秒, nofail選項用來持續查詢服務器直到收到一個響應, -x會作反向地址查詢. 比較下邊這3個命令的輸出, dig -x, ipcalc -h和 nslookup. dig -x 81.9.6.2 traceroute : 跟蹤包發送到遠端主機過程當中的路由信息. 這個命令在LAN, WAN, 或者在Internet上均可以正常工做. 遠端主機能夠經過IP地址來指定. 這個命令的輸出也能夠經過管道中的grep或sed命令來過濾. ping : 廣播一個"ICMP ECHO_REQUEST"包到其餘主機上, 既能夠是本地網絡也能夠是遠端網絡. 這是一個測試網絡鏈接的診斷工具, 應該當心使用.若是ping成功之行, 那麼返回的退出狀態碼爲0. 能夠用在腳本的測試語句中. whois : 執行DNS(域名系統)查詢. -h選項容許指定須要查詢的特定whois服務器 rcp : 遠端拷貝, 在網絡上的不一樣主機間拷貝文件. rsync : 遠端同步, 在網絡上的不一樣主機間(同步)更新文件. ssh : 安全shell, 登錄遠端主機並在其上運行命令. 這個工具具備身份認證和加密的功能, 能夠安全的替換telnet, rlogin, rcp, 和rsh等工具. scp : 安全拷貝, 在功能上與rcp很類似, 就是在兩個不一樣的網絡主機之間拷貝文件, 可是要使用鑑權的方式, 而且要使用與ssh相似的安全層.
netstat : 顯示當前網絡的統計情況和信息, 好比路由表和激活的鏈接, 這個工具將訪問/proc/net(27)中的信息.netstat -r等價於route命令.
route : 顯示內核路由表信息, 或者查看內核路由表的修改狀況.
du du的英文爲:disk usage,含義是磁盤空間使用狀況,功能是逐級進入指定目錄的每個子目錄並顯示該目錄佔用文件系統數據塊的狀況,若是沒有指定目錄,則對當前的目錄進行統計。 du的命令各個選項含義以下: a:顯示所有目錄和其次目錄下的每一個檔案所佔的磁盤空間 s:只顯示各檔案大小的總合 b:大小用bytes來表示 x:跳過在不一樣文件系統上的目錄不予統計 a:遞歸地顯示指定目錄中各文件及子孫目錄中各文件佔用的數據塊數 du -s只展現目錄的使用總量(不分別展現各個子目錄狀況),-m是以MB爲單位展現目錄的大小(固然-k/-g就是KB/GB了)。
df 於du不一樣的是,du是面向文件的命令,只計算被文件佔用的空間。不計算文件系統metadata 佔用的空間。df則是基於文件系統整體來計算,經過文件系統中未分配空間來肯定系統中已經分配空間的大小。df命令能夠獲取硬盤佔用了多少空間,還剩下多少空間,它也能夠顯示全部文件系統對i節點和磁盤塊的使用狀況。 df命令各個選擇的含義以下: a:顯示所有的檔案系統和各分割區的磁盤使用情形 i:顯示i -nodes的使用量 k:大小用k來表示 (默認值) t:顯示某一個檔案系統的全部分割區磁盤使用量 x:顯示不是某一個檔案系統的全部分割區磁盤使用量 T:顯示每一個分割區所屬的檔案系統名稱