使用 Linux
系統的開發者,很多人都有自己喜歡的系統命令,下面這個幾個命令令是我平常用的比較多的,分享一下。
我不會教科書般的羅列每個指令的詳細用法,只是把日常開發過程中的一些場景下,經常使用的命令常見用法進行演示。
希望對您有小小的幫助~~也非常歡迎各位大俠,在留言區分享您的私房命令。
grep、awk、sed 這三個指令,作為 Linux
系統中文字處理的三大法寶,我最喜歡、最常用的就是 grep
指令,沒有之一!
它的基本用法是:
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN]... [-f FILE]... [FILE...]
看起來有那麼的選項,我最常用的是這 2
個場景:
1. 在一個檔案或者資料夾中,查詢指定的字串:
grep -rni "pthread" *
-r: 遞迴查詢;
-n:列印行號;
-i: 不區分大小寫;
2. 檢視某個程式的相關資訊,例如:程式 ID
$ ps -aux | grep bash
root 4681 0.0 0.1 24892 5912 pts/3 Ss 10:10 0:00 bash
root 18052 0.0 0.0 15968 960 pts/3 S+ 13:38 0:00 grep --color=auto bash
可以看到,結果中出現了 grep
這個指令自身的程式資訊,可以通過 -v
選項過濾掉它:
$ ps -aux | grep bash | grep -v grep
root 4681 0.0 0.1 24892 5912 pts/3 Ss 10:10 0:00 bash
最後,再結合 awk
命令,就可以把程式ID 4681
提取出來了:
$ ps -aux | grep bash | grep -v grep | awk '{print $2}'
4681
在一些指令碼工具中,這樣的用法還是很常見的。
例如:在一些守護程式的啟動指令碼中,都會利用這條指令來判斷:當前系統中是否已經有一個例項正在執行了。
看到這個指令,您一定會疑惑:僅僅一個字母 q,這是何方神聖?
Linux
系統中壓根就沒有這個命令!
是的,這個字母僅僅是一個 alias
(別名)。
我有很強的強迫症,在終端視窗執行一條命令的時候,我經常會需要確認指令是否執行正確。
在 Linux
系統中,$?
用來表示最後命令的退出狀態: 0
表示沒有錯誤,其他表示有錯誤。
因此,在執行完一條命令後,可以執行下面的這條命令來確認:剛才執行的那條命令是否成功了。
echo $?
強迫症的問題是解決了,但是由於這條指令使用的太頻繁了,需要敲那麼多的字元,還要結合 shift
按鍵。
於是我就給它設定了一個 alias
(別名)。
設定 alias
的方法估計都知道啊,就是在個人家目錄下的 .bashrc
中修改。
我的 alias
設定如下:
alias ll='ls -lF'
alias la='ls -A'
alias l='ls -CF'
alias q='echo $?'
這樣的話,每次執行完一條系統命令之後,隨手敲一個字母 q
就可以檢查執行結果了,省時省力!
可能有些人會奇:pwd
怎麼會是常用命令呢?它的作用是列印當前路徑,在命令列視窗中,路徑是一直顯示出來的啊!
沒錯,在預設的情況下,當前所處的路徑資訊,是直接顯示出來的,如下:
root@ubuntu:~/OpenSource/linux-4.15/samples/watchdog$
但是這裡有一個小小的問題:如果終端視窗的大小並不是全屏的,如果目錄層次比較深,那麼顯示的路徑資訊就會特別的長,這樣的話,本來就不太寬的終端視窗就顯得很擠,輸入命令的時候很可能要折返到下一行去。
於是,我就喜歡把這個顯示的路徑給它縮短:只顯示最後一個檔案目錄,如下:
root@ubuntu:watchdog$
也就是把前面的 ~/OpenSource/linux-4.15/samples
路徑資訊都丟掉,這樣的話,終端視窗中就有足夠的空間來輸入了。
如果某個時候,我想看一下當前目錄的全路徑,那麼就執行一下 pwd 這個指令就可以了。
這就是我為什麼經常使用 pwd
命令的原因。
那麼,應該怎麼樣來去掉顯示路徑中的目錄資訊呢?
還是修改家目錄下的 .bashrc
檔案:
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
找到上面這幾行內容,把最後面的 \w
修改成 \W
即可,也就是小寫的 w
改成大寫的 W
。
如果你正在測試,請不要忘記使用 source .bashrc
或者 . .bashrc
命令來重新載入哦!
find
命令用來查詢符合指定條件的檔案。
我最常用的場景就是:查詢指定名稱或型別的檔案了。
特別是在寫 Makefile
的時候,經常遇到找不到標頭檔案的錯誤,於是就可以這樣查詢:
find ./ -name xxx.h
或者按照字尾名來查詢檔案:
find ./ -name *.txt
history
用來記錄執行過的命令,如果您很少使用這條命令,那說明您的記憶力很好!
但是對於我這樣忘性比較好的人來說,history
命令簡直太有用了!
我在命令列視窗中測試某段程式碼,經常需要反覆的做這樣的排錯過程:修改程式碼-編譯-執行-檢視結果。
如果編譯指令比較長,我相信沒有誰樂意一個字元一個字元的敲鍵盤,大部分是使用 history
列出最近使用的命令,然後複製、貼上一下。
檢視歷史命令的時候,由於輸出太多,可以結合 grep
指令,只顯示我們感興趣的命令記錄,例如:
history | grep gcc
那麼,結果中將只會顯示帶有 gcc
字眼的那些命令。
另外,還有一個小技巧:在不檢視 history
的情況下,快速的輸入之前執行過的某條指令(有一個前提條件:你必須能記住那條指令中剛開始的幾個字元)。
比如,之前已經執行過這條指令:
gcc -m32 -Wl,--export-dynamic -o main main.c -ldl
幾分鐘之後,我想再次執行這條命令,可以這麼做:
同時按下 control 和 r 這兩個按鍵,此時輸入游標處就會變成這樣:
root@ubuntu:tmp$
(reverse-i-search)`':
這時,可以輸入命令最前面的幾個字母:gcc -m
,此時終端就會到歷史命令記錄中去查詢,輸入的字元越多,匹配就越精確。
如果輸入的字元,精準的匹配到了某個歷史命令記錄,它就立刻把這條命令完整的顯示出來。
這個小技巧真的很好用,推薦您試一下!
od
命令用來輸出給定檔案的內容。
輸入檔案內容的指令有很多了:cat
、head
、tail
等等。但是 od
命令主要用來檢視檔案的二進位制編碼,顯示的時候可以以指定的進位制進行顯示。
在之前的一篇拆解 ELF 格式的文章中:Linux系統中編譯、連結的基石-ELF檔案:扒開它的層層外衣,從位元組碼的粒度來探索,我就大量的使用了 od
指令,在一個 ELF
格式的檔案中,從任意地址開始、讀取任意長度的位元組碼。
例如下面這條指令:讀取 main
檔案中最開始的 52
個位元組的內容:
od -Ax -t x1 -N 52 main
main
是 Linux
系統中的可執行程式,當然也就是 ELF
格式了。
od
指令中使用到了下面這幾個選項:
-Ax: 顯示地址的時候,用十六進位制來表示。如果使用 -Ad,意思就是用十進位制來顯示地址;
-t -x1: 顯示位元組碼內容的時候,使用十六進位制(x),每次顯示一個位元組(1);
-N 52:只需要讀取 52 個位元組;
可以看出 main
檔案最開始的四個位元組:7f 是 ELF 檔案的魔數,45 4c 46 是 "ELF" 3個字母。
因此,使用 od
命令來分析二進位制檔案的內容,還是很有威力的!
for
這個命令,常常出現在指令碼檔案中,用來處理迴圈的情況,比如:遍歷檔案、計數,例如:
#!/bin/bash
for file in /tmp/*;
do
echo $file;
done
我在使用 for
的時候,最常用的場景是給很多相同字尾的檔案,按順序進行重新命名:
i=0;for x in *.mp4; do n=$(printf "%02d" "$i"); mv $x $n.mp4; let i=i+1; done
這裡是按照純數字來重新命名的,也可以根據需要加上字首等字串。
這裡還有一個小問題需要注意一下:如果檔名中存在空格,mv
指令就會提示錯誤:
mv: target 'xxx' is not a directory
解決方法是:在終端視窗中,先執行一下這個命令:
IFS='
'
然後,再執行批量重新命名命令,就不會出現錯誤了!
當然,更好的方式是,把這幾個命令寫成一個指令碼檔案,實現對任意型別的檔案進行批量重新命名功能,然後放在自己的私有 bin
目錄下,隨取隨用。
別擔心,我已經幫你寫好了,如下所示(file_rename.sh
):
#!/bin/bash
if [ $# -eq 0 ];then
sufix=mp4
else
sufix=$1
fi
IFS='
'
i=0;for x in *.$sufix; do n=$(printf "%02d" "$i"); mv $x $n.$sufix; let i=i+1; done
只要執行 ./file_rename.sh
,就會預設把當前目錄下所有 mp4
檔案進行重新命名。
如果是其他型別的檔案,那就傳遞一個引數進去。
比如:如果要批量對 png
格式的圖片進行重新命名,那就執行 ./file_rename.sh png
,最後的 png
是傳入的引數,對應於指令碼檔案中的 $1
變數。
期待您在留言區分享自己的私房指令,任何技術問題可以探討!
推薦閱讀
【1】C語言指標-從底層原理到花式技巧,用圖文和程式碼幫你講解透徹
【2】一步步分析-如何用C實現物件導向程式設計
【3】原來gdb的底層除錯原理這麼簡單
【4】內聯彙編很可怕嗎?看完這篇文章,終結它!
【5】都說軟體架構要分層、分模組,具體應該怎麼做