12.26 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">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>

回到過去的時光機


Linux 命令行黑技術(LTS)


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

!回到過去的時光機

使用!的步驟:

  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)



分享到:


相關文章: