Linux 命令行黑技術(LTS)

Linux命令行,是開發人員日常接觸的東西。但是,有很多小技巧。我在這裡做個總結(長期更新)。

Linux 命令行黑技術(LTS)


在路徑間如魚得水

黑技術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 -,在兩個路徑之間“反覆橫跳”。


Linux 命令行黑技術(LTS)


例如:第一個路徑是/etc/nginx/,第二個路徑是~/project/,我們先cd /etc/nginx/下,然後,再cd ~/project/。隨後,當我們需要切換另一個路徑只需要cd -就可以實現。

黑技術3:將路徑通過棧的方式訪問

如果,遇到訪問路徑的過程像棧這種數據結構,那麼我們可以用pushd來解決。 實現過程:

  1. 導航到相應的目錄例如/tmp/push1
  2. 使用pushd命令壓入目錄棧
  3. 在其他路徑下,使用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字頭命令。這個系列一共有:

  1. zgrep
  2. zcat
  3. zless
  4. zmore
  5. 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>

回到過去的時光機


Linux 命令行黑技術(LTS)


黑技術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

!回到過去的時光機

使用!的步驟:

  1. 通過history找到命令的序號,也就是history命令輸出前面的數字。
  2. 通過!前面得到的數字,然後,回車。就會將相應序號後面的命令補全到終端提示符後。

例子:

<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命令,在我們的歷史記錄裡面。

將歷史命令的參數作為新命令的參數

場景一:當兩個命令相鄰時


Linux 命令行黑技術(LTS)

標題十分繞口。這裡直接上例子(注意#後面的是我對下面的命令做的解釋):


<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強大的下載工具


Linux 命令行黑技術(LTS)


黑技術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後臺服務器開發 學習課程大綱給大家


Linux 命令行黑技術(LTS)



分享到:


相關文章: