搞定 Linux 命令之程序與資料流,不服來辯!| 原力計劃
本文中,我們將一起來學習Linux程序和資料流的操作,比如過濾文字,統計文字、重定向、管道流、程序操作等,當然只是談談常用的命令以及引數,如果想詳細看的話可以man command,利用Linux自帶的命令手冊去檢視一下你想查的命令。文章比較有趣,相信大家看了以後會很有收穫的!當然,如果說裡面有什麼問題的話,歡迎和博主華山論劍。
資料處理
1.grep:進行資料的過濾與篩選。我們平時處理檔案時,肯定想查詢或者過濾一下我們感興趣的資訊,那麼我們就會用到這個東東了。
用法:
grep text file:這個就是在file檔案中查詢text文字內容了
這個就是在test.csv檔案裡面查詢Jane內容了,查詢到了就會打印出來它所在的行,並且會給它點顏色看看。
當然,我們查詢的文字如果沒有空格可以直接輸入,如果說有空格的話就要用雙引號包起來。
grep -i text file:查詢文字內容的時候忽略大小寫,其中的i選項就是ignore的意思嘛,忽略大小寫。
查詢jane的時候忽略大小寫,因此查到了Jane。
grep -n text file:n表示number的意思,查詢文字內容的時候顯示對應行號 :
這個就把查詢內容對應的行號顯示出來了。
grep -v text file:v表示invert,即顛倒的意思,查詢與文字無關的內容。
這個說好了查詢80,結果顛倒過來不聽話給出來和80無關的行內容。
grep -r text file:r表示recursive,即遞迴的意思,在子目錄,子檔案當中查詢文字內容,file一般為目錄。如果你不知道你要查詢的文字在哪個內容,就可以一氣呵成乾脆點,目錄裡面全盤搜尋。
不小心在系統根目錄裡面查了個80,結果一堆和80有關的,看來是全域性搜尋沒錯了。
grep搭配正則表示式:接引數E。看看一些常用並且傳統的正則表示式符號:
來試試:
這個就是利用符號^來查,就是查詢開頭為Jane的文字行內容,你看這不打印出來了嘛。對於其它的符號,大家都可以試試。
2.sort:對文字行內容進行排序。如果說你在操作檔案的時候,感覺好雜亂無章,你想讓它更好看一些,就可以排序一下。
用法:
sort sort.txt:對文字行內容排序,預設的是對文字行的首字母進行升序排序:
sort -o new_file file:給file檔案排序,將排序以後的結果存入到新檔案中,如果說沒有這個檔案,那麼就會建立。
sort -r file:有人可能會問,咦,為什麼只能升序排呢?不能倒序。我想說這個就是倒序了,r就是reverse的意思嘛,按照行內容首字母倒序排序。
sort -R file:隨機排序,這個看心情吧,它想怎麼排就怎麼,很叛逆。
sort -n file:既然有根據首字母來排序的,那麼遇到數字怎麼辦,那就用這個,n就是number,數字的意思,對數字排序
當然,以上所有的引數都可以搭配使用,比如說對數字倒序排序:sort -r -n file。靈活變通就行啦。
3.wc:這個可不是我們平時說的WC,用處可大了,可以統計我們文本當中的行數,單詞數,位元組數等等。
用法:
wc file:統計file檔案的行數,單詞數,位元組數(從左至右顯示列數)。
wc -l file:只統計行數,l就是line嘛。
wc -w file:只統計單詞數,w就是word。
wc -c file:只統計位元組數,c就是count嘛。
wc -m file:只統計字元數。
4.uniq:uniq一看就直到是unique,與眾不同嘛,那麼就允許重複的出現,這個就是為了刪除檔案中的重複內容。
uniq repeat.txt:刪除該檔案中的重複內容,打印出處理後的內容
uniq repeat.txt new.txt :把處理後的內容放到一個新檔案中
uniq -c repeat :顯示重複的行數,比如說1重複了3行,那麼顯示3 1
uniq -d repeat:d就是duplicated,即重複的,只顯示重複的行的值
5.cut:剪下檔案內容,可以做到提取部分我們想要的內容。
用法:
cut -c 2-4 file:每一行只保留第2到4個字元,-c就是根據字元剪下。
輸出重定向
我們輸入一個命令以後,它的結果一般有三個去處:
終端
檔案(把結果放到檔案中)
其它命令的輸入(它的輸出可以作為其它命令的輸入)
我們之前看到的有終端,檔案的,接下來博主會介紹一種新的,即去往其它命令的輸入(管道的時候會說)。
1.>: 把輸出內容重定向到一個檔案中,並且如果這個檔案已經存在並且有內容則會覆蓋。
cat命令的結果最終重定向輸出到test檔案中去了,如果多次重定向到這個檔案,那麼就會覆蓋之前的內容。
2.>>: 這個就和上面有點差別,雖然也是重定向輸出到檔案但是不會覆蓋,只是會繼續接到後面。
3. 2>:上面那幾個都是標準輸出的重定向,前提在於那些命令是對的,不會報錯,但是這個命令就和上面不一樣了,雖然用法一樣,但是這個是標準錯誤輸出的重定向,如果說命令錯誤了,那麼錯誤資訊就可以用這個來重定向輸出。
4. 2>>: 這個也和上面介紹的>>差不多,只不過也是錯誤輸出的重定向,不會覆蓋。
5. 2>&1: 把錯誤和標準輸出都重定向到檔案中,一般放最後面,和>,>>一起搭配使用。
比如說:
catnot_exist_file.csv >results.txt 2>&1
這個就是標準輸出,錯誤輸出都會重定向到results.txt檔案中。
輸入重定向
1.<:>
cat test.csv:就是以這個檔案本身作為輸入進行處理,也就是要先開啟檔案,再列印檔案內容
而cat <>
2.<<:>
cat <<>
3.管道 | :把一個命令的輸出重定向到一個命令的輸入,命令與命令之間建立管道,可以多個。
這個就是把鍵盤輸入的內容,進行cat列印的輸出,重定向到sort的輸入,二者建立管道。
為什麼用管道,管道能夠更加簡單,多個命令一起用嘛, 比如說du,就是深入遍歷每一個目錄:
但是這樣的話時間花那麼久,而且列出來的雜亂無章,因此可以利用其它命令一起處理一下下:
這樣的話打印出來的檔案目錄就可以按照大小進行排序了,看起來就很舒服了。nice!!!
檢視系統活動與程序
1.w:檢視當前系統有哪些使用者登入了以及使用者的具體資訊
從左到右看:
當前時間為01:25:36,執行正常(up表示正常),已經運行了兩小時24分鐘了,只有一個使用者,之後的load average表示負載,三個數值分別表示:
1 分鐘以內的平均負載(0.01)
5 分鐘之內的平均負載(0.02)
15 分鐘之內的平均負載(0.02)
之後兩行就是登入的使用者列表,分別為使用者名稱,登入的終端名稱,使用者連線到的伺服器的IP地址(由於這個是本機,因此是:0),剛開始登入的時間,使用者多久沒活躍了,該終端所有相關程序使用CPU的時間,當下程序使用CPU的時間以及當下執行的程序。
2.ps:列出執行的程序
對於ps命令:如果說不加任何引數,直接使用,就是列出當前使用者在當前終端正在執行的程序(從左到右依次為程序ID,程序執行的終端,執行時間,產生這個程序的程式名):
ps -ef:列出所有使用者所有終端正在執行的程序
ps -efH:以喬木狀列出所有程序
ps -u 使用者名稱 :列出此使用者執行的程序
ps -aux :透過CPU和記憶體使用來過濾程序
ps tree :以樹形結構來顯示程序,父子程序也有
列出的有:使用者名稱 程序ID 父程序ID 產生程序的程式名等等。
但是ps命令有一個缺點,就是靜態的,只能記錄當下那一刻的程序,不會實時監控。
3.top:解決ps的缺點,可以動態檢視,實時監控,但是至少顯示前面幾個最消耗處理器的程序,佔滿終端一頁就行了。
當然,top還是可互動的,進入top後,還可以輸入命令進行控制:
q:退出top
h:檢視top內部命令
s:改變重新整理時間,預設是3s
u:過濾程序,檢視使用者
k:殺掉某個程序,後面接ID
當然還有一些更好的,比如說:glances,htop這些檢視程序的軟體,需要的可以下載並且使用。
程序操作與系統重啟
這個就比較簡單了,就不做過多贅述了。
1.殺掉程序:
ctrl C:快捷鍵可以終止終端中正在執行的程式
擴充套件:ctrl shift c可以複製,ctrl shift v可以貼上
kill命令殺掉程序:
kill 7800:殺掉PID為7800的程序(當然可以同時加上多個程序PID,同時殺掉多個程序)
但是kill殺掉程序比較溫和,有些程序不會馬上結束。
如果需要馬上殺掉,就輸入:kill -9 7800
killall 程式名:殺掉多個程序,且程式名為find
2.系統方面:
halt:關閉系統
reboot:重啟系統
前後臺程序切換
1.&:在後臺執行程序,比如說:ls &:這個命令就可以在後臺執行ls程序,我們不必要等他結束再輸入下一個命令了。
但是這個和當前終端相關聯,因此關閉終端以後,該後臺程序也會結束。
但是nohup可以避免這個問題,讓程序和終端分離:nohup command,放最前面。
這樣ls就變成了後臺程序,不需要等它列完,我們可以直接再輸入命令。
2.ctrl z:轉到後臺程序,並且暫停執行,也就是說這個程序還在,到後臺去了:
之前運行了top命令,那麼top就會佔據整個終端,除非我們按q退出這個程序,否則不能繼續輸入其它命令(除了top內部的互動外),因此按下ctrl z就可以把這個程序放到後臺,然後暫停,我們就可以繼續輸入命令了(記住!!!程序沒有退出,只是到後臺!暫停了!)
3.bg:background的意思,背景後臺嘛。轉到後臺程序執行,並不會暫停,如果說已經是後臺,但是暫停,則會執行。
如果單獨使用則針對最近的一個程序,一般是後面接程序標號
4.jobs:顯示後臺程序狀態
這個就是我們之前的top後臺程序了。從左到右依次為:後臺程序標號 程序狀態 命令。這個就代表著:top程序狀態為Stopped,程序標號為1.
5.fg:既然可以轉為後臺程序,那麼必然可以轉為前臺程序了,這個命令就是的,用法和bg一樣。
來看看這幾個命令之間的關係吧:
定時和延時執行
1.at:延時執行一個程式(sudo apt install at,要下載):
用法:
at 時刻,之後就會叫我們輸入命令,我們輸入的命令就會在我們設定的這個時刻執行,這個命令會叫你不斷輸入,直到你Ctrl D 打住為止。
at now 時間間隔:就是在現在開始的多少時間後執行
這個就是從現在開始的一分鐘之後執行ls,ps -ef命令,並且定義為at任務3.
當然還有其它時間關鍵字,分別為:
minutes:表示“分鐘”;
hours:表示“小時”;
days:表示“天”;
weeks:表示“星期”;
months:表示“月”;
years:表示“年”
2.atq和atrm:
atq:列出正在等待執行的at任務
正在等待執行的at任務是2號,在對應的時間執行。
atrm:刪除正在等待執行的at任務,rm就是移除嘛!
我的atrm移除了那個任務,因此atq之後沒有at任務
3.sleep:休息一下再執行
這個就是先建立一個檔案,暫停10秒後再刪掉,暫停期間不能輸入其它命令,和at不一樣,at是過一段時間執行,但是輸入完後,還是可以輸入其它命令的。
後面接的數字預設為秒,但是還有其它的:
h:hour 的縮寫,表示“小時”;
d:day 的縮寫,表示“天”。
m:minute 的縮寫,表示“分鐘”;
比如說touch file.txt ; sleep 15m ; rm file.txt //這個就是暫停15分鐘了
拓展:
上面的命令直接用分號分隔,其實就是命令的先後順序,前面的執行完後,執行後面的,直接意義上,並沒有關聯性,不像管道那樣。當然還有&&和||分隔符,看看它們和分號的區別:
&&:&& 號前的命令執行成功,才會執行後面的命令。
||:|| 號前的命令執行失敗,才會執行後面的命令。
分號:不論分號前的命令執行成功與否,都執行分號後的命令。前後命令之間沒有相關性。
以後你想一口氣執行完你需要的命令就可以利用這些分隔符來。
4…crontab:定時執行程式
at是過一段時間執行一次命令,而這個是定時重複多次。
而crontab這個命令其實就是用來讀取和修改名為crontab的檔案,這個檔案包含了我們要定時執行的程式列表,還有執行的時刻。
用法:
顯示crontab檔案:crontab -l
當然,剛開始是沒有這些檔案的,要我們自己去建立。
既然沒有就去建立:
crontab -e:輸入之後會進入一個編輯器介面(開始我們地選擇什麼編輯器,我選擇了nano,就是1),這就是我們建立的crontab檔案,我們只要輸入我們要定時在什麼時候執行我們的命令就行了。
格式:
定時時間 命令:定時時間分為五個區域,依次分別為分鐘 小時 日 月份 星期幾,如果說不想輸入,就輸入*代替就行了。
這就是我們編輯的定時命令:在每天的10點01分的時候執行ls命令。輸入完以後儲存就行了:
crontab -r:當然,如果我們不喜歡這個命令了就可以刪除掉,這個就是來刪除crontab檔案的。
當然這裡還有其它關於crontab檔案裡面的命令的相關舉例: