Linux命令行,是開發人員平常接觸的東西。可是,有不少小技巧。我在這裏作個總結(長期更新)。 android
若是,你常用一個目錄做爲你的根目錄,那麼,你能夠經過CDPATH來指定你的cd根目錄。 例如,我常常到/etc
目錄下,來対相應的文件進行配置。好比我想從個人家目錄到/etc/nginx/
目錄下,通常的方法是:nginx
cd /etc/nginx/
複製代碼
有沒有能夠偷懶的法子呢?固然有,咱們能夠在.bashrc
(若是你是zsh的話,就在.zshrc
下)加入export CDPATH=/etc
如今,你想打開的/etc/nginx/
目錄下,只須要輸入:正則表達式
cd nginx
複製代碼
懶人必備。 固然,你能夠輸入多個根路徑,只要在每一個路徑下用:
隔開。apache
export CDPATH=.:~:/etc:/var:
複製代碼
當咱們常常須要在一個terminal下,在兩個路徑之間,來回切換。這個時候,咱們可使用cd -
,在兩個路徑之間「反覆橫跳」。vim
例如:第一個路徑是/etc/nginx/
,第二個路徑是~/project/
,咱們先cd /etc/nginx/
下,而後,再cd ~/project/
。隨後,當咱們須要切換另外一個路徑只須要cd -
就能夠實現。瀏覽器
若是,遇到訪問路徑的過程像棧這種數據結構,那麼咱們能夠用pushd
來解決。 實現過程:tomcat
/tmp/push1
pushd
命令壓入目錄棧popd
命令,導航到棧頂目錄。在/tmp/
目錄下建立來push1
,push2
,push3
三個目錄,需求是將這三個目錄分別壓入目錄棧,而後分別導航到相應的目錄。下面將顯示整個過程:bash
# 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 ~
複製代碼
整個過程很是簡單,相信你們都能看得懂。數據結構
固然咱們能夠將導航與壓棧操做結合起來,咱們能夠將下面的代碼寫到.bashrc
或者.zshrc
下來實現。app
function pushcd(){
cd "$@" && eval pushd .;
}
複製代碼
而後,壓棧和切換路徑一個命令解決。
若是咱們身處一個特別深的目錄下,例如:/dev/bus/usb/001
。那麼,咱們如何切換到/dev/bus/
目錄下咧?通常的作法是cd ../..
,這裏只有兩級目錄看似仍是能夠接受的,可是,若是,有一天,要回退五級目錄。那麼通常的寫法就不優雅了。因此,在這裏要介紹一個黑技術。使用alias
來解決問題。在咱們的.bashrc
或者.zshrc
下輸入:
alias ..="cd .."
alias ..2="cd ../.."
alias ..3="cd ../../.."
alias ..4="cd ../../../.."
alias ..5="cd ../../../../.."
複製代碼
而後,咱們回退兩級目錄將變成..2
,優雅,快樂,美麗。 固然,也能夠用其餘表示方法:例如:cd1
,cd2
...
在平常的開發中,咱們常常須要建立一個文件夾,而且,導航到這個目錄。可是,爲了優(tou)雅(lan)。咱們能夠把兩個命令和在一塊兒。建立一個新的命令mkdircd
。把下面的代碼添加到.bashrc
或者.zshrc
下:
function mkdircd(){
mkdir -p "$@" && eval cd "\"\$$#\"";
}
複製代碼
這樣就OK了。
咱們常常在terminal中,使用系統剪切板。好比,將一個命令的輸出複製到剪切板,而後,粘貼到瀏覽器或其餘地方等等的用途。首先,咱們須要一個軟件叫xsel
。在各大發行版本中的包管理中都有,好比在arch中pacman -S xsel
就能夠安裝了。
1.將命令輸出到剪切板,好比,我想將ls
的結果複製到剪切板中,那麼輸入下面的命令就能夠了:
ls | xsel -i -b
複製代碼
爲了更加方便調用,咱們能夠.zshrc
或者.bashrc
填入以下代碼:
alias to_clipboard="sel -i -b"
複製代碼
那麼,剛剛的例子就變成了:
ls | to_clipboard
複製代碼
固然,咱們也能夠集成查看剪切板內容的命令,在.zshrc
或是.bashrc
中添加:
alias clipboard="xsel -b -o"
複製代碼
當咱們在terminal中輸入clipboard
時,就會將剪切板的內容輸出。
在Linux中,壓縮的格式有不少種類,例如,經常使用的有.tar.gz
,zip
,tar.bz2
等等。解壓命令「又臭又長」,那麼,咱們能不能一個命令就能夠把全部的壓縮格式的文件解壓出來咧?固然是能夠的,咱們只須要將下面腳本添加到.zshrc
或者.bashrc
裏,就能夠作到一個命令解壓全部:
注意:你的機器裏須要預先安裝了unrar,unzip命令
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
}
複製代碼
有些時候,咱們須要直接查看壓縮包裏的內容,而不須要解壓這個壓縮包,那麼咱們可使用z
字頭命令。這個系列一共有:
#我先建立幾個文本文件
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
複製代碼
grep是咱們常用的文本搜索工具。那麼,咱們如何使咱們的grep具備與,或,非搜索條件? 在介紹使用以前,咱們先顯示咱們要處理的數據(employee文件)
100 張三 CEO 薪水 100k
101 李四 android工程師 薪水 10k
102 王五 IOS工程師 薪水 10k
103 劉六 Web工程師 薪水 20k
104 馮七 大數據工程師 薪水 25k
複製代碼
grep並無直接的」與「命令,須要咱們使用正則表達式來模擬與命令
grep -E "字符1.*字符2" filename
grep -E "字符1.*字符2|字符2.*字符1" filename
複製代碼
咱們要匹配要姓張,而且是CEO兩個條件。那麼,咱們輸入的命令是:
grep -E "張.*CEO" employee
複製代碼
咱們要找文檔中姓李與姓張的人: 方法1:
grep '字符1\|字符2' filename
複製代碼
grep '張\|李' employee
複製代碼
方法2:
grep -E '字符1|字符2' employee
複製代碼
grep -E '張|李' employee
複製代碼
除去全部姓李的人
grep -v '字符1' employee
複製代碼
grep -v '李' employee
複製代碼
Ctrl+R
平常開發工做的時候,咱們常常遇到須要輸入大量相似的,重複的命令。那麼,咱們能不能有一種方式能夠根據幾個字母,找到之前輸入命令。方法固然是有的,就是Ctrl+R
快捷鍵。
這裏經過例子來展現一下,如何使用Ctrl+R
。 首先,使用history | tail -4
來看下咱們要用到的後四條歷史記錄:
1476 cd document
1477 ls
1478 service httpd stop
1479 cd /dev/cpu/
複製代碼
若是,我想從新執行cd document
命令,那麼,我須要輕敲鍵盤上的Ctrl+R
鍵,而後,輸入cd
就能夠看到命令行自動將cd document
填入到終端提示符後。這個時候只要輕敲回車,那麼,就能夠復現命令。
# 按Ctrl+R鍵,而後,輸入cd
$bck-i-search:cd
# 下面爲命令行自動補全的命令
$cd document
複製代碼
這個步驟與場景一相似,當咱們找到咱們須要更改的命令,而後,按左鍵或者右鍵,退出搜索模式,導航到咱們須要修改的參數後,使用Ctrl+w
刪除整個參數,修改便可。下面我用一個例子來解釋。這個例子是將1478 service httpd stop
的stop
參數改成start
。
# 按Ctrl+R
$bck-i-search:service
# 找到相應的命令,而後按左,右導航鍵,退出搜索模式
$ service httpd stop
# 而後咱們按Ctrl-e到咱們須要修改的stop參數後
$ service httpd stop
# 使用Ctrl+w刪除參數
$ service httpd
# 補成咱們須要的參數
$ service httpd start
複製代碼
經過export HISTTIMEFORMAT='%F %T
就可讓history顯示時間戳。固然,你能夠把這句話寫到你的.bashrc
裏去,變成全局配置。下面展現一下效果吧。
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
...
複製代碼
注意不支持
zsh
,zsh
的相關命令是HIS_STAMPS=dd-mm-yyyy
使用!的步驟:
history
找到命令的序號,也就是history
命令輸出前面的數字。$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
複製代碼
export HISTCONTROL=ignoredups
命令,就能夠去除該命令之後的history記錄中的重複命令。這句話好像有點繞,下面我用例子來表示:
$export HISTCONTROL=ignoredups
$pwd
$pwd
$pwd
$history | tail -3
...
1111 pwd
...
複製代碼
正如上例所示,咱們輸入的3個pwd命令,最後,只剩下一個pwd命令,在咱們的歷史記錄裏面。
# 這裏咱們使用cp命令來複制一個名爲text的文件
$cp text text.bak
# 咱們想經過vim來編輯text.bak,只須要輸入vim !^
$vim !^
#下面這條命令是當咱們輸入完上一條命令後,回車自動填充的內容
$ vim text.bak
# 咱們想經過vim來編輯text,只須要輸入vim !!:$
$vim !!:$
#下面這條命令是當咱們輸入完上一條命令後,回車自動填充的內容
$ vim text
複製代碼
這裏假設有以下命令command1 arg1 arg2 arg3 arg4
,咱們須要在command2
中使用command1
一中的arg2
參數,那麼咱們如何用一種優雅的方式取到arg2
參數?咱們能夠經過!!:2
的方式取到,同理,若是,咱們須要arg3
參數,那麼能夠經過!!:3
,依次類推。
$command1 arg1 arg2 arg3 arg4
$command2 !!:2
#下面這條命令是當咱們輸入完上一條命令後,回車自動填充的內容
$command2 arg2
$command2 !!:3
#下面這條命令是當咱們輸入完上一條命令後,回車自動填充的內容
$command2 arg3
複製代碼
若是,兩個命令不相鄰,固然也是有方法的。直接用例子來解釋吧。
$history|tail -3
...
command1 arg1 arg2 arg3 arg4
...
#咱們的命令command2須要參數arg2
$command2 !command1:2
#下面這條命令是當咱們輸入完上一條命令後,回車自動填充的內容
#command2 arg2
複製代碼
下載限速,主要是用在多個任務環境。由於,咱們經常須要在下載的同時作一些其餘的事情。例如,瀏覽網頁。可是,wget
命令默認開啓全速下載,這個時候,可能影響到咱們其餘的任務。因此,須要讓wget
慢一點。wget
經過--limit-rate
來限制速度,舉個例子:
# 使用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
複製代碼
正(kai)常(che)的後臺下載。
wget -b http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-7/v7.0.86/bin/apache-tomcat-7.0.86-fulldocs.tar.gz
複製代碼
有些下載連接必需要經過瀏覽器下載,咱們能夠經過一些設置,讓wget
的下載請求,像瀏覽器通常:
# URL-TO-DOWNLOAD是下載連接
wget --user-agent="Mozilla/5.0 (X11; Linux x86_64; rv:59.0) Gecko/20100101 Firefox/59.0" URL-TO-DOWNLOAD
複製代碼
咱們有些時候須要知道這個連接是否能夠下載,而後,対不一樣的狀況做出判斷。
wget --spider http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-7/v7.0.86/bin/apache-tomcat-7.0.86-fulldocs.tar.gz
複製代碼
若是出現相似於下面的狀況(最後之後顯示存在遠程文件),那麼證實能夠下載:
打開 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]
存在遠程文件
複製代碼
下載文件超過5MB,自動退出下載。
wget -Q5m 下載連接
複製代碼
find . -maxdepth 1 -type f -exec ls -s {} \; | sort -n -r
複製代碼
咱們能夠把上面的命令使用alias
寫入咱們的.bashrc
和.zshrc
,命名爲ls_big
:
alias ls_big="find . -maxdepth 1 -type f -exec ls -s {} \; | sort -n -r"
複製代碼
find . -maxdepth 1 -type f -exec ls -s {} \; | sort -n
複製代碼
與上面同樣,咱們能夠寫道配置文件裏
alias ls_small="find . -maxdepth 1 -type f -exec ls -s {} \; | sort -n"
複製代碼
這個需求,咱們只須要使用ls -lt
命令就能夠來,固然,若是想要逆序輸出ls -ltr
find . -maxdepth 1 -type f -name ".*"
複製代碼
咱們能夠寫到配置文件中:
alias ls_file_hide="find .-maxdepth -type f -name ".*""
複製代碼
find . -maxdepth 1 -type d -name ".*"
複製代碼
同理:
alias ls_file_hide="find .-maxdepth -type d -name ".*""
複製代碼