Linux命令行,是開發人員日常接觸的東西。但是,有很多小技巧。我在這裡做個總結(長期更新)。
在路徑間如魚得水
黑技術1:設立根目錄
如果,你經常使用一個目錄作為你的根目錄,那麼,你可以通過CDPATH來指定你的cd根目錄。 例如,我經常到/etc目錄下,來対相應的文件進行配置。比如我想從我的家目錄到/etc/nginx/目錄下,一般的方法是:
<code>cd /etc/nginx/
複製代碼/<code>
有沒有可以偷懶的法子呢?當然有,我們可以在.bashrc(如果你是zsh的話,就在.zshrc下)加入export CDPATH=/etc 現在,你想打開的/etc/nginx/目錄下,只需要輸入:
<code>cd nginx
複製代碼/<code>
懶人必備。 當然,你可以輸入多個根路徑,只要在每個路徑下用:隔開。
<code>export CDPATH=.:~:/etc:/var:
複製代碼/<code>
黑技術2:在兩個路徑相互切換
當我們經常需要在一個terminal下,在兩個路徑之間,來回切換。這個時候,我們可以使用cd -,在兩個路徑之間“反覆橫跳”。
例如:第一個路徑是/etc/nginx/,第二個路徑是~/project/,我們先cd /etc/nginx/下,然後,再cd ~/project/。隨後,當我們需要切換另一個路徑只需要cd -就可以實現。
黑技術3:將路徑通過棧的方式訪問
如果,遇到訪問路徑的過程像棧這種數據結構,那麼我們可以用pushd來解決。 實現過程:
- 導航到相應的目錄例如/tmp/push1
- 使用pushd命令壓入目錄棧
- 在其他路徑下,使用popd命令,導航到棧頂目錄。
例子:
在/tmp/目錄下創建來push1,push2,push3三個目錄,需求是將這三個目錄分別壓入目錄棧,然後分別導航到相應的目錄。下面將顯示整個過程:
<code># pcdack @ pcdack-sword in /tmp/push1 [18:58:01]
$ pwd
/tmp/push1
# pcdack @ pcdack-sword in /tmp/push1 [18:58:15]
$ pushd .
/tmp/push1 /tmp ~
# pcdack @ pcdack-sword in /tmp/push1 [18:58:22]
$ cd /tmp/push2
# pcdack @ pcdack-sword in /tmp/push2 [18:58:31]
$ pushd .
/tmp/push2 /tmp/push1 /tmp ~
# pcdack @ pcdack-sword in /tmp/push2 [18:58:37]
$ cd /tmp/push3
# pcdack @ pcdack-sword in /tmp/push3 [19:00:23]
$ pushd .
/tmp/push3 /tmp/push2 /tmp/push1 /tmp ~
# pcdack @ pcdack-sword in /tmp/push3 [19:00:28]
$ popd
/tmp/push2 /tmp/push1 /tmp ~
# pcdack @ pcdack-sword in /tmp/push2 [19:00:37]
$ popd
/tmp/push1 /tmp ~
複製代碼/<code>
整個過程非常簡單,相信大家都能看得懂。
腳本:
當然我們可以將導航與壓棧操作結合起來,我們可以將下面的代碼寫到.bashrc或者.zshrc下來實現。
<code>function pushcd(){
cd "$@" && eval pushd .;
}
複製代碼/<code>
然後,壓棧和切換路徑一個命令解決。
黑技術4:“優雅”的切換上級目錄
如果我們身處一個特別深的目錄下,例如:/dev/bus/usb/001。那麼,我們如何切換到/dev/bus/目錄下咧?一般的做法是cd ../..,這裡只有兩級目錄看似還是可以接受的,但是,如果,有一天,要回退五級目錄。那麼一般的寫法就不優雅了。所以,在這裡要介紹一個黑技術。使用alias來解決問題。在我們的.bashrc或者.zshrc下輸入:
<code>alias ..="cd .."
alias ..2="cd ../.."
alias ..3="cd ../../.."
alias ..4="cd ../../../.."
alias ..5="cd ../../../../.."
複製代碼/<code>
然後,我們回退兩級目錄將變成..2,優雅,快樂,美麗。 當然,也可以用其他表示方法:例如:cd1,cd2...
黑技術5:mkdir與cd的結合
在日常的開發中,我們經常需要創建一個文件夾,並且,導航到這個目錄。但是,為了優(tou)雅(lan)。我們可以把兩個命令和在一起。創建一個新的命令mkdircd。把下面的代碼添加到.bashrc或者.zshrc下:
<code>function mkdircd(){
mkdir -p "$@" && eval cd "\"\\$$#\"";
}
複製代碼/<code>
這樣就OK了。
原來你是這樣的剪切板
我們經常在terminal中,使用系統剪切板。比如,將一個命令的輸出複製到剪切板,然後,粘貼到瀏覽器或其他地方等等的用途。首先,我們需要一個軟件叫xsel。在各大發行版本中的包管理中都有,比如在arch中pacman -S xsel就可以安裝了。
使用
1.將命令輸出到剪切板,比如,我想將ls的結果複製到剪切板中,那麼輸入下面的命令就可以了:
<code>ls | xsel -i -b
複製代碼/<code>
為了更加方便調用,我們可以.zshrc或者.bashrc填入如下代碼:
<code>alias to_clipboard="sel -i -b"
複製代碼/<code>
那麼,剛剛的例子就變成了:
<code>ls | to_clipboard
複製代碼/<code>
當然,我們也可以集成查看剪切板內容的命令,在.zshrc或是.bashrc中添加:
<code>alias clipboard="xsel -b -o"
複製代碼/<code>
當我們在terminal中輸入clipboard時,就會將剪切板的內容輸出。
壓縮文件自如操作
黑技術1:萬能解壓命令
在Linux中,壓縮的格式有很多種類,例如,常用的有.tar.gz,zip,tar.bz2等等。解壓命令“又臭又長”,那麼,我們能不能一個命令就可以把所有的壓縮格式的文件解壓出來咧?當然是可以的,我們只需要將下面腳本添加到.zshrc或者.bashrc裡,就可以做到一個命令解壓所有:
注意:你的機器裡需要預先安裝了unrar,unzip命令
<code>ex ()
{
if [ -f $1 ] ; then
case $1 in
*.tar.bz2) tar xjf $1 ;;
*.tar.gz) tar xzf $1 ;;
*.bz2) bunzip2 $1 ;;
*.rar) unrar x $1 ;;
*.gz) gunzip $1 ;;
*.tar) tar xf $1 ;;
*.tbz2) tar xjf $1 ;;
*.tgz) tar xzf $1 ;;
*.zip) unzip $1 ;;
*.Z) uncompress $1;;
*.7z) 7z x $1 ;;
*) echo "'$1' cannot be extracted via ex()" ;;
esac
else
echo "'$1' is not a valid file"
fi
}
複製代碼/<code>
黑技術2:頭文字“Z”
有些時候,我們需要直接查看壓縮包裡的內容,而不需要解壓這個壓縮包,那麼我們可以使用z字頭命令。這個系列一共有:
- zgrep
- zcat
- zless
- zmore
- zdiff 這些命令其實和不帶"z"的功能類似,只不過作用的對象不一樣。"z"命令是專門用在壓縮文件下的。 例子:
<code>#我先創建幾個文本文件
echo "this first line">first
gzip first
# 我們通過調用z命令來查看內容
zcat first.gz
# 當然同理我們可以通過zless,zmore來查看
# zgrep需要查找的字符用\\-i參數指定,比如我想查找帶有`line`字眼的內容:
zgrep -i line first.gz
# zdiff用來對比兩個歸檔文件的不同,與diff類似
# 我們首先創建一個新的文本
echo "this second line">second
gzip second
# 然後進行對比
zdiff first.gz second.gz
複製代碼/<code>
”智慧“的Grep命令
黑技術:使grep具有與,或,非的邏輯
grep是我們經常使用的文本搜索工具。那麼,我們如何使我們的grep具有與,或,非搜索條件? 在介紹使用之前,我們先顯示我們要處理的數據(employee文件)
<code>100 張三 CEO 薪水 100k
101 李四 android工程師 薪水 10k
102 王五 IOS工程師 薪水 10k
103 劉六 Web工程師 薪水 20k
104 馮七 大數據工程師 薪水 25k
複製代碼/<code>
與
grep並沒有直接的”與“命令,需要我們使用正則表達式來模擬與命令
<code>grep -E "字符1.*字符2" filename
grep -E "字符1.*字符2|字符2.*字符1" filename
複製代碼/<code>
我們要匹配要姓張,並且是CEO兩個條件。那麼,我們輸入的命令是:
<code>grep -E "張.*CEO" employee
複製代碼/<code>
或
我們要找文檔中姓李與姓張的人: 方法1:
<code>grep '字符1\\|字符2' filename
複製代碼/<code>
<code>grep '張\\|李' employee
複製代碼/<code>
方法2:
<code>grep -E '字符1|字符2' employee
複製代碼/<code>
<code>grep -E '張|李' employee
複製代碼/<code>
非
除去所有姓李的人
<code>grep -v '字符1' employee
複製代碼/<code>
<code>grep -v '李' employee
複製代碼/<code>
回到過去的時光機
黑技術1:靈活的Ctrl+R
日常開發工作的時候,我們經常遇到需要輸入大量類似的,重複的命令。那麼,我們能不能有一種方式可以根據幾個字母,找到以前輸入命令。方法當然是有的,就是Ctrl+R快捷鍵。
這裡通過例子來展示一下,如何使用Ctrl+R。 首先,使用history | tail -4來看下我們要用到的後四條歷史記錄:
<code>1476 cd document
1477 ls
1478 service httpd stop
1479 cd /dev/cpu/
複製代碼/<code>
情景一:重複歷史命令
如果,我想重新執行cd document命令,那麼,我需要輕敲鍵盤上的Ctrl+R鍵,然後,輸入cd就可以看到命令行自動將cd document填入到終端提示符後。這個時候只要輕敲回車,那麼,就可以復現命令。
<code># 按Ctrl+R鍵,然後,輸入cd
$bck-i-search:cd
# 下面為命令行自動補全的命令
$cd document
複製代碼/<code>
情景二:在歷史命令的基礎上更改參數
這個步驟與場景一類似,當我們找到我們需要更改的命令,然後,按左鍵或者右鍵,退出搜索模式,導航到我們需要修改的參數後,使用Ctrl+w刪除整個參數,修改即可。下面我用一個例子來解釋。這個例子是將1478 service httpd stop的stop參數改為start。
<code># 按Ctrl+R
$bck-i-search:service
# 找到相應的命令,然後按左,右導航鍵,退出搜索模式
$ service httpd stop
# 然後我們按Ctrl-e到我們需要修改的stop參數後
$ service httpd stop
# 使用Ctrl+w刪除參數
$ service httpd
# 補成我們需要的參數
$ service httpd start
複製代碼/<code>
黑技術2:history 你不知道的事
讓 history 顯示時間戳
通過export HISTTIMEFORMAT='%F %T就可以讓history顯示時間戳。當然,你可以把這句話寫到你的.bashrc裡去,變成全局配置。下面展示一下效果吧。
<code>export HISTTIMEFORMAT='%F %T '
history | more
...
11 2018-04-19 12:54:15 zip STM32+HTTP/
12 2018-04-19 12:54:15 zip STM32+HTTP.zip STM32+HTTP/
13 2018-04-19 12:54:15 ;s
14 2018-04-19 12:54:15 man zip
15 2018-04-19 12:54:15 zip -r STMHTTP STM32+HTTP/
16 2018-04-19 12:54:15 ls
17 2018-04-19 12:54:15 mnt_entertain
18 2018-04-19 12:54:15 cd_entertainment
...
複製代碼/<code>
注意不支持zsh,zsh的相關命令是HIS_STAMPS=dd-mm-yyyy
!回到過去的時光機
使用!的步驟:
- 通過history找到命令的序號,也就是history命令輸出前面的數字。
- 通過!前面得到的數字,然後,回車。就會將相應序號後面的命令補全到終端提示符後。
例子:
<code>$history | head
10 2018-04-19 12:54:15 ls
11 2018-04-19 12:54:15 zip STM32+HTTP/
12 2018-04-19 12:54:15 zip STM32+HTTP.zip STM32+HTTP/
13 2018-04-19 12:54:15 ;s
14 2018-04-19 12:54:15 man zip
15 2018-04-19 12:54:15 zip -r STMHTTP STM32+HTTP/
16 2018-04-19 12:54:15 ls
17 2018-04-19 12:54:15 mnt_entertain
18 2018-04-19 12:54:15 cd_entertainment
19 2018-04-19 12:54:15 ls
# 如果我想重複第17號命令,在終端提示符輸入!17然後按回車
$!17
$mnt_entertain
複製代碼/<code>
去掉歷史記錄中重複的命令
export HISTCONTROL=ignoredups命令,就可以去除該命令以後的history記錄中的重複命令。這句話好像有點繞,下面我用例子來表示:
<code>$export HISTCONTROL=ignoredups
$pwd
$pwd
$pwd
$history | tail -3
...
1111 pwd
...
複製代碼/<code>
正如上例所示,我們輸入的3個pwd命令,最後,只剩下一個pwd命令,在我們的歷史記錄裡面。
將歷史命令的參數作為新命令的參數
場景一:當兩個命令相鄰時
標題十分繞口。這裡直接上例子(注意#後面的是我對下面的命令做的解釋):
<code># 這裡我們使用cp命令來複制一個名為text的文件
$cp text text.bak
# 我們想通過vim來編輯text.bak,只需要輸入vim !^
$vim !^
#下面這條命令是當我們輸入完上一條命令後,回車自動填充的內容
$ vim text.bak
# 我們想通過vim來編輯text,只需要輸入vim !!:$
$vim !!:$
#下面這條命令是當我們輸入完上一條命令後,回車自動填充的內容
$ vim text
複製代碼/<code>
如果有多個參數
這裡假設有如下命令command1 arg1 arg2 arg3 arg4,我們需要在command2中使用command1一中的arg2參數,那麼我們如何用一種優雅的方式取到arg2參數?我們可以通過!!:2的方式取到,同理,如果,我們需要arg3參數,那麼可以通過!!:3,依次類推。
<code>$command1 arg1 arg2 arg3 arg4
$command2 !!:2
#下面這條命令是當我們輸入完上一條命令後,回車自動填充的內容
$command2 arg2
$command2 !!:3
#下面這條命令是當我們輸入完上一條命令後,回車自動填充的內容
$command2 arg3
複製代碼/<code>
場景二:當兩個命令不相鄰
如果,兩個命令不相鄰,當然也是有方法的。直接用例子來解釋吧。
<code>$history|tail -3
...
command1 arg1 arg2 arg3 arg4
...
#我們的命令command2需要參數arg2
$command2 !command1:2
#下面這條命令是當我們輸入完上一條命令後,回車自動填充的內容
#command2 arg2
複製代碼/<code>
wget強大的下載工具
黑技術1:下載限速
下載限速,主要是用在多個任務環境。因為,我們常常需要在下載的同時做一些其他的事情。例如,瀏覽網頁。但是,wget命令默認開啟全速下載,這個時候,可能影響到我們其他的任務。所以,需要讓wget慢一點。wget通過--limit-rate來限制速度,舉個例子:
<code># 使用wget下載。並且,限制速度不超過200k。
wget --limit-rate=200k http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-7/v7.0.86/bin/apache-tomcat-7.0.86-fulldocs.tar.gz
複製代碼/<code>
黑技術2:後臺下載:
正(kai)常(che)的後臺下載。
<code>wget -b http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-7/v7.0.86/bin/apache-tomcat-7.0.86-fulldocs.tar.gz
複製代碼/<code>
黑技術3:模擬瀏覽器請求
有些下載鏈接必須要通過瀏覽器下載,我們可以通過一些設置,讓wget的下載請求,像瀏覽器一般:
<code># URL-TO-DOWNLOAD是下載鏈接
wget --user-agent="Mozilla/5.0 (X11; Linux x86_64; rv:59.0) Gecko/20100101 Firefox/59.0" URL-TO-DOWNLOAD
複製代碼/<code>
黑技術4:試探下載鏈接是否可以下載
我們有些時候需要知道這個鏈接是否可以下載,然後,対不同的情況作出判斷。
<code>wget --spider http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-7/v7.0.86/bin/apache-tomcat-7.0.86-fulldocs.tar.gz
複製代碼/<code>
如果出現類似於下面的情況(最後以後顯示存在遠程文件),那麼證明可以下載:
<code>打開 Spider 模式。檢查是否存在遠程文件。
--2018-04-20 22:51:42-- http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-7/v7.0.86/bin/apache-tomcat-7.0.86-fulldocs.tar.gz
正在解析主機 mirrors.tuna.tsinghua.edu.cn (mirrors.tuna.tsinghua.edu.cn)... 101.6.8.193, 2402:f000:1:408:8100::1
正在連接 mirrors.tuna.tsinghua.edu.cn (mirrors.tuna.tsinghua.edu.cn)|101.6.8.193|:80... 已連接。
已發出 HTTP 請求,正在等待回應... 200 OK
長度:5162656 (4.9M) [application/octet-stream]
存在遠程文件
複製代碼/<code>
黑技術5:超過一定大小的文件退出下載
下載文件超過5MB,自動退出下載。
<code>wget -Q5m 下載鏈接
複製代碼/<code>
文件列表“進化”
黑技術1:根據文件大小從大到小(從小到大)顯示文件
當前文件夾下從大到小排列
<code> find . -maxdepth 1 -type f -exec ls -s {} \\; | sort -n -r
複製代碼/<code>
我們可以把上面的命令使用alias寫入我們的.bashrc和.zshrc,命名為ls_big:
<code>alias ls_big="find . -maxdepth 1 -type f -exec ls -s {} \\; | sort -n -r"
複製代碼/<code>
當前文件夾下從小到大排列
<code>find . -maxdepth 1 -type f -exec ls -s {} \\; | sort -n
複製代碼/<code>
與上面一樣,我們可以寫道配置文件裡
<code>alias ls_small="find . -maxdepth 1 -type f -exec ls -s {} \\; | sort -n"
複製代碼/<code>
黑技術2:根據文件的時間戳顯示文件
這個需求,我們只需要使用ls -lt命令就可以來,當然,如果想要逆序輸出ls -ltr
黑技術3:查看當前文件所有的隱藏文件和文件夾
文件
<code>find . -maxdepth 1 -type f -name ".*"
複製代碼/<code>
我們可以寫到配置文件中:
<code>alias ls_file_hide="find .-maxdepth -type f -name ".*""
複製代碼/<code>
文件夾
<code>find . -maxdepth 1 -type d -name ".*"
複製代碼/<code>
同理:
<code>alias ls_file_hide="find .-maxdepth -type d -name ".*""/<code>
另外還有一些關於c++ Linux後臺服務器開發的一些知識點分享:Linux,Nginx,MySQL,Redis,P2P,K8S,Docker,TCP/IP,協程,DPDK,webrtc,音視頻等等視頻。
喜歡的朋友可以後臺私信【1】獲取學習視頻
附上一份c++ Linux後臺服務器開發 學習課程大綱給大家
閱讀更多 開心玩技術 的文章