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">firstgzip first# 我們通過調用z命令來查看內容zcat first.gz# 當然同理我們可以通過zless,zmore來查看# zgrep需要查找的字符用\\-i參數指定,比如我想查找帶有`line`字眼的內容:zgrep -i line first.gz# zdiff用來對比兩個歸檔文件的不同,與diff類似# 我們首先創建一個新的文本echo "this second line">secondgzip second # 然後進行對比zdiff first.gz second.gz複製代碼/<code>
”智慧“的Grep命令
黑技術:使grep具有與,或,非的邏輯
grep是我們經常使用的文本搜索工具。那麼,我們如何使我們的grep具有與,或,非搜索條件? 在介紹使用之前,我們先顯示我們要處理的數據(employee文件)
<code>100 張三 CEO 薪水 100k101 李四 android工程師 薪水 10k102 王五 IOS工程師 薪水 10k103 劉六 Web工程師 薪水 20k104 馮七 大數據工程師 薪水 25k複製代碼/<code>
與
grep並沒有直接的”與“命令,需要我們使用正則表達式來模擬與命令
<code>grep -E "字符1.*字符2" filenamegrep -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 document1477 ls1478 service httpd stop1479 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 ;s14 2018-04-19 12:54:15 man zip15 2018-04-19 12:54:15 zip -r STMHTTP STM32+HTTP/16 2018-04-19 12:54:15 ls17 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後臺服務器開發 學習課程大綱給大家
閱讀更多 開心玩技術 的文章