bash 命令速查表

##############################################################################

BASH CHEATSHEET (中文速查表) - by skywind (created on 2018/02/14)

Version: 20, Last Modified: 2018/02/25 07:20

https://github.com/skywind3000/awesome-cheatsheets

##############################################################################

##############################################################################

常用快捷鍵

##############################################################################

CTRL+A # 移動(dòng)到行首,同 <Home>
CTRL+B # 向后移動(dòng),同 <Left>
CTRL+C # 結(jié)束當(dāng)前命令
CTRL+D # 刪除光標(biāo)前的字符,同 <Delete> ,或者沒有內(nèi)容時(shí),退出會(huì)話
CTRL+E # 移動(dòng)到行末,同 <End>
CTRL+F # 向前移動(dòng),同 <Right>
CTRL+G # 退出當(dāng)前編輯(比如正在 CTRL+R 搜索歷史時(shí))
CTRL+H # 刪除光標(biāo)左邊的字符,同 <Backspace>
CTRL+K # 刪除光標(biāo)位置到行末的內(nèi)容
CTRL+L # 清屏并重新顯示
CTRL+N # 移動(dòng)到命令歷史的下一行,同 <Down>
CTRL+O # 類似回車,但是會(huì)顯示下一行歷史
CTRL+P # 移動(dòng)到命令歷史的上一行,同 <Up>
CTRL+R # 歷史命令反向搜索,使用 CTRL+G 退出搜索
CTRL+S # 歷史命令正向搜索,使用 CTRL+G 退出搜索
CTRL+T # 交換前后兩個(gè)字符
CTRL+U # 刪除字符到行首
CTRL+V # 輸入字符字面量,先按 CTRL+V 再按任意鍵
CTRL+W # 刪除光標(biāo)左邊的一個(gè)單詞
CTRL+X # 列出可能的補(bǔ)全
CTRL+Y # 粘貼前面 CTRL+u/k/w 刪除過的內(nèi)容
CTRL+Z # 暫停前臺(tái)進(jìn)程返回 bash,需要時(shí)可用 fg 將其切換回前臺(tái)
CTRL+_ # 撤銷(undo),有的終端將 CTRL+_ 映射為 CTRL+/ 或 CTRL+7

ALT+b # 向后(左邊)移動(dòng)一個(gè)單詞
ALT+d # 刪除光標(biāo)后(右邊)一個(gè)單詞
ALT+f # 向前(右邊)移動(dòng)一個(gè)單詞
ALT+t # 交換字符
ALT+BACKSPACE # 刪除光標(biāo)前面一個(gè)單詞,類似 CTRL+W,但不影響剪貼板

CTRL+X CTRL+X # 連續(xù)按兩次 CTRL+X,光標(biāo)在當(dāng)前位置和行首來回跳轉(zhuǎn)
CTRL+X CTRL+E # 用你指定的編輯器,編輯當(dāng)前命令

##############################################################################

BASH 基本操作

##############################################################################

exit # 退出當(dāng)前登陸
env # 顯示環(huán)境變量
echo $SHELL # 顯示你在使用什么 SHELL

bash # 使用 bash,用 exit 返回
whereis bash # 查找 bash 在哪里
which bash # 查找哪個(gè)程序?qū)?yīng)命令 bash

clear # 清初屏幕內(nèi)容
reset # 重置終端(當(dāng)你不小心 cat 了一個(gè)二進(jìn)制,終端狀態(tài)亂掉時(shí)使用)

##############################################################################

目錄操作

##############################################################################

cd # 返回自己 $HOME 目錄
cd {dirname} # 進(jìn)入目錄
pwd # 顯示當(dāng)前所在目錄
mkdir {dirname} # 創(chuàng)建目錄
mkdir -p {dirname} # 遞歸創(chuàng)建目錄
pushd {dirname} # 目錄壓棧并進(jìn)入新目錄
popd # 彈出并進(jìn)入棧頂?shù)哪夸?br> dirs -v # 列出當(dāng)前目錄棧
cd - # 回到之前的目錄
cd -{N} # 切換到目錄棧中的第 N個(gè)目錄,比如 cd -2 將切換到第二個(gè)

##############################################################################

文件操作

##############################################################################

ls # 顯示當(dāng)前目錄內(nèi)容,后面可接目錄名:ls {dir} 顯示指定目錄
ls -l # 列表方式顯示目錄內(nèi)容,包括文件日期,大小,權(quán)限等信息
ls -a # 顯示所有文件和目錄,包括隱藏文件(.開頭的文件/目錄名)
ln -s {fn} {link} # 給指定文件創(chuàng)建一個(gè)軟鏈接
cp {src} {dest} # 拷貝文件,cp -r dir1 dir2 可以遞歸拷貝(目錄)
rm {fn} # 刪除文件,rm -r 遞歸刪除目錄,rm -f 強(qiáng)制刪除
mv {src} {dest} # 移動(dòng)文件,如果 dest 是目錄,則移動(dòng),是文件名則覆蓋
touch {fn} # 創(chuàng)建或者更新一下制定文件
cat {fn} # 輸出文件原始內(nèi)容
any_cmd > {fn} # 執(zhí)行任意命令并將標(biāo)準(zhǔn)輸出重定向到指定文件
more {fn} # 逐屏顯示某文件內(nèi)容,空格翻頁,q 退出
less {fn} # 更高級(jí)點(diǎn)的 more,更多操作,q 退出
head {fn} # 顯示文件頭部數(shù)行,可用 head -3 abc.txt 顯示頭三行
tail {fn} # 顯示文件尾部數(shù)行,可用 tail -3 abc.txt 顯示尾部三行
tail -f {fn} # 持續(xù)顯示文件尾部數(shù)據(jù),可用于監(jiān)控日志
nano {fn} # 使用 nano 編輯器編輯文件
vim {fn} # 使用 vim 編輯文件
diff {f1} {f2} # 比較兩個(gè)文件的內(nèi)容
wc {fn} # 統(tǒng)計(jì)文件有多少行,多少個(gè)單詞
chmod 644 {fn} # 修改文件權(quán)限為 644,可以接 -R 對(duì)目錄循環(huán)改權(quán)限
chown user1 {fn} # 修改文件所有人為 user1, chown user1:group1 fn 可以修改組
grep {pat} {fn} # 在文件中查找出現(xiàn)過 pat 的內(nèi)容
grep -r {pat} . # 在當(dāng)前目錄下遞歸查找所有出現(xiàn)過 pat 的文件內(nèi)容

##############################################################################

用戶管理

##############################################################################

whoami # 顯示我的用戶名
passwd # 修改密碼,passwd {user} 可以用于 root 修改別人密碼
finger {user} # 顯示某用戶信息,包括 id, 名字, 登陸狀態(tài)等
adduser {user} # 添加用戶
deluser {user} # 刪除用戶
last {user} # 顯示登陸記錄
w # 查看誰在線
su # 切換到 root 用戶
su - # 切換到 root 用戶并登陸(執(zhí)行登陸腳本)
su {user} # 切換到某用戶
su -{user} # 切換到某用戶并登陸(執(zhí)行登陸腳本)
id {user} # 查看用戶的 uid,gid 以及所屬其他用戶組
id -u {user} # 打印用戶 uid
id -g {user} # 打印用戶 gid
write {user} # 向某用戶發(fā)送一句消息

##############################################################################

進(jìn)程管理

##############################################################################

ps # 查看當(dāng)前會(huì)話進(jìn)程
ps ax # 查看所有進(jìn)程,類似 ps -e
ps aux # 查看所有進(jìn)程詳細(xì)信息,類似 ps -ef
ps auxww # 查看所有進(jìn)程,并且顯示進(jìn)程的完整啟動(dòng)命令
ps -u {user} # 查看某用戶進(jìn)程
ps axjf # 列出進(jìn)程樹
ps -eo pid,user,command # 按用戶指定的格式查看進(jìn)程
ps aux | grep httpd # 查看名為 httpd 的所有進(jìn)程
ps --ppid {pid} # 查看父進(jìn)程為 pid 的所有進(jìn)程

kill {pid} # 結(jié)束進(jìn)程
kill -9 {pid} # 強(qiáng)制結(jié)束進(jìn)程,9/SIGKILL 是強(qiáng)制不可捕獲結(jié)束信號(hào)
kill -KILL {pid} # 強(qiáng)制執(zhí)行進(jìn)程,kill -9 的另外一種寫法
kill -l # 查看所有信號(hào)
kill -l TERM # 查看 TERM 信號(hào)的編號(hào)
killall {procname} # 按名稱結(jié)束進(jìn)程

top # 查看最活躍的進(jìn)程
top -u {user} # 查看某用戶最活躍的進(jìn)程

any_command & # 在后臺(tái)運(yùn)行某命令,也可用 CTRL+Z 將當(dāng)前進(jìn)程掛到后臺(tái)
jobs # 查看所有后臺(tái)進(jìn)程(jobs)
bg # 查看后臺(tái)進(jìn)程,并切換過去
fg # 切換后臺(tái)進(jìn)程到前臺(tái)
fg {job} # 切換特定后臺(tái)進(jìn)程到前臺(tái)

trap cmd sig1 sig2 # 在腳本中設(shè)置信號(hào)處理命令
trap "" sig1 sig2 # 在腳本中屏蔽某信號(hào)
trap - sig1 sig2 # 恢復(fù)默認(rèn)信號(hào)處理行為

disown {PID|JID} # 將進(jìn)程從后臺(tái)任務(wù)列表(jobs)移除

wait # 等待所有后臺(tái)進(jìn)程任務(wù)結(jié)束

##############################################################################

常用命令:SSH / 系統(tǒng)信息 / 網(wǎng)絡(luò)

##############################################################################

ssh user@host # 以用戶 user 登陸到遠(yuǎn)程主機(jī) host
ssh -p {port} user@host # 指定端口登陸主機(jī)
ssh-copy-id user@host # 拷貝你的 ssh key 到遠(yuǎn)程主機(jī),避免重復(fù)輸入密碼
scp {fn} user@host:path # 拷貝文件到遠(yuǎn)程主機(jī)
scp user@host:path dest # 從遠(yuǎn)程主機(jī)拷貝文件回來
scp -P {port} ... # 指定端口遠(yuǎn)程拷貝文件

uname -a # 查看內(nèi)核版本等信息
man {help} # 查看幫助
info {help} # 查看幫助,info pages,比 man 更強(qiáng)的幫助系統(tǒng)
uptime # 查看系統(tǒng)啟動(dòng)時(shí)間
date # 顯示日期
cal # 顯示日歷
vmstat # 顯示內(nèi)存和 CPU 使用情況
vmstat 10 # 每 10 秒打印一行內(nèi)存和 CPU情況,CTRL+C 退出
free # 顯示內(nèi)存和交換區(qū)使用情況
df # 顯示磁盤使用情況
du # 顯示當(dāng)前目錄占用,du . --max-depth=2 可以指定深度
showkey -a # 查看終端發(fā)送的按鍵編碼

ping {host} # ping 遠(yuǎn)程主機(jī)并顯示結(jié)果,CTRL+C 退出
ping -c N {host} # ping 遠(yuǎn)程主機(jī) N 次
traceroute {host} # 偵測路由連通情況
mtr {host} # 高級(jí)版本 traceroute
whois {domain} # 取得域名 whois 信息
dig {domain} # 取得域名 dns 信息

wget {url} # 下載文件,可加 --no-check-certificate 忽略 ssl 驗(yàn)證
wget -qO- {url} # 下載文件并輸出到標(biāo)準(zhǔn)輸出(不保存)
curl -sL {url} # 同 wget -qO- {url} 沒有 wget 的時(shí)候使用

sz {file} # 發(fā)送文件到終端,zmodem 協(xié)議
rz # 接收終端發(fā)送過來的文件

##############################################################################

變量操作

##############################################################################

varname=value # 定義變量
varname=value command # 定義子進(jìn)程變量并執(zhí)行子進(jìn)程
echo $varname # 查看變量內(nèi)容
echo $$ # 查看當(dāng)前 shell 的進(jìn)程號(hào)
echo $! # 查看最近調(diào)用的后臺(tái)任務(wù)進(jìn)程號(hào)
echo $? # 查看最近一條命令的返回碼
export VARNAME=value # 設(shè)置環(huán)境變量(將會(huì)影響到子進(jìn)程)

array[0]=valA # 定義數(shù)組
array[1]=valB
array[2]=valC
array=([0]=valA [1]=valB [2]=valC) # 另一種方式
array=(valA valB valC) # 另一種方式

${array[i]} # 取得數(shù)組中的元素
${#array[@]} # 取得數(shù)組的長度
${#array[i]} # 取得數(shù)組中某個(gè)變量的長度

declare -a # 查看所有數(shù)組
declare -f # 查看所有函數(shù)
declare -F # 查看所有函數(shù),僅顯示函數(shù)名
declare -i # 查看所有整數(shù)
declare -r # 查看所有只讀變量
declare -x # 查看所有被導(dǎo)出成環(huán)境變量的東西
declare -p varname # 輸出變量是怎么定義的(類型+值)

${varname:-word} # 如果變量不為空則返回變量,否則返回 word
${varname:=word} # 如果變量不為空則返回變量,否則賦值成 word 并返回
${varname:?message} # 如果變量不為空則返回變量,否則打印錯(cuò)誤信息并退出
${varname:+word} # 如果變量不為空則返回 word,否則返回 null
${varname:offset:len} # 取得字符串的子字符串

${variable#pattern} # 如果變量頭部匹配 pattern,則刪除最小匹配部分返回剩下的
${variable##pattern} # 如果變量頭部匹配 pattern,則刪除最大匹配部分返回剩下的
${variable%pattern} # 如果變量尾部匹配 pattern,則刪除最小匹配部分返回剩下的
${variable%%pattern} # 如果變量尾部匹配 pattern,則刪除最大匹配部分返回剩下的
${variable/pattern/str} # 將變量中第一個(gè)匹配 pattern 的替換成 str,并返回
${variable//pattern/str} # 將變量中所有匹配 pattern 的地方替換成 str 并返回

${#varname} # 返回字符串長度

*(patternlist) # 零次或者多次匹配
+(patternlist) # 一次或者多次匹配
?(patternlist) # 零次或者一次匹配
@(patternlist) # 單詞匹配
!(patternlist) # 不匹配

array=($text) # 按空格分隔 text 成數(shù)組,并賦值給變量
IFS="/" array=($text) # 按斜桿分隔字符串 text 成數(shù)組,并賦值給變量
text="${array[]}" # 用空格鏈接數(shù)組并賦值給變量
text=$(IFS=/; echo "${array[
]}") # 用斜杠鏈接數(shù)組并賦值給變量

$(UNIX command) # 運(yùn)行命令,并將標(biāo)準(zhǔn)輸出內(nèi)容捕獲并返回
varname=$(id -u user) # 將用戶名為 user 的 uid 賦值給 varname 變量

num=$(expr 1 + 2) # 兼容 posix sh 的計(jì)算,使用 expr 命令計(jì)算結(jié)果
num=$(expr $num + 1) # 數(shù)字自增
expr 2 * ( 2 + 3 ) # 兼容 posix sh 的復(fù)雜計(jì)算,輸出 10

num=$((1 + 2)) # 計(jì)算 1+2 賦值給 num,使用 bash 獨(dú)有的 $((..)) 計(jì)算
num=$(($num + 1)) # 變量遞增
num=$((num + 1)) # 變量遞增,雙括號(hào)內(nèi)的 $ 可以省略
num=$((1 + (2 + 3) * 2)) # 復(fù)雜計(jì)算

##############################################################################

函數(shù)

##############################################################################

定義一個(gè)新函數(shù)

function myfunc() {

$1 代表第一個(gè)參數(shù),$N 代表第 N 個(gè)參數(shù)

$# 代表參數(shù)個(gè)數(shù)

$0 代表被調(diào)用者自身的名字

$@ 代表所有參數(shù),類型是個(gè)數(shù)組

$* 空格鏈接起來的所有參數(shù),類型是字符串

{shell commands ...}
}

myfunc # 調(diào)用函數(shù) myfunc
myfunc arg1 arg2 arg3 # 帶參數(shù)的函數(shù)調(diào)用
unset -f myfunc # 刪除函數(shù)
declare -f # 列出函數(shù)定義

##############################################################################

條件判斷(兼容 posix sh 的條件判斷):man test

##############################################################################

statement1 && statement2 # and 操作符
statement1 || statement2 # or 操作符

exp1 -a exp2 # exp1 和 exp2 同時(shí)為真時(shí)返回真
exp1 -o exp2 # exp1 和 exp2 有一個(gè)為真就返回真
( expression ) # 如果 expression 為真時(shí)返回真,輸入注意括號(hào)前反斜桿
! expression # 如果 expression 為假那返回真

str1 = str2 # 判斷字符串相等,如 [ "$x" = "$y" ] && echo yes
str1 != str2 # 判斷字符串不等,如 [ "$x" != "$y" ] && echo yes
str1 < str2 # 字符串小于,如 [ "$x" < "$y" ] && echo yes
str2 > str2 # 字符串大于,注意 < 或 > 是字面量,輸入時(shí)要加反斜桿
-n str1 # 判斷字符串不為空(長度大于零)
-z str1 # 判斷字符串為空(長度等于零)

-a file # 判斷文件存在,如 [ -a /tmp/abc ] && echo "exists"
-d file # 判斷文件存在,且該文件是一個(gè)目錄
-e file # 判斷文件存在,和 -a 等價(jià)
-f file # 判斷文件存在,且該文件是一個(gè)普通文件(非目錄等)
-r file # 判斷文件存在,且可讀
-s file # 判斷文件存在,且尺寸大于0
-w file # 判斷文件存在,且可寫
-x file # 判斷文件存在,且執(zhí)行
-N file # 文件上次修改過后還沒有讀取過
-O file # 文件存在且屬于當(dāng)前用戶
-G file # 文件存在且匹配你的用戶組
file1 -nt file2 # 文件1 比 文件2 新
file1 -ot file2 # 文件1 比 文件2 舊

num1 -eq num2 # 數(shù)字判斷:num1 == num2
num1 -ne num2 # 數(shù)字判斷:num1 != num2
num1 -lt num2 # 數(shù)字判斷:num1 < num2
num1 -le num2 # 數(shù)字判斷:num1 <= num2
num1 -gt num2 # 數(shù)字判斷:num1 > num2
num1 -ge num2 # 數(shù)字判斷:num1 >= num2

##############################################################################

分支控制:if 和經(jīng)典 test,兼容 posix sh 的條件判斷語句

##############################################################################

test {expression} # 判斷條件為真的話 test 程序返回0 否則非零
[ expression ] # 判斷條件為真的話返回0 否則非零

test "abc" = "def" # 查看返回值 echo $? 顯示 1,因?yàn)闂l件為假
test "abc" != "def" # 查看返回值 echo $? 顯示 0,因?yàn)闂l件為真

test -e /tmp; echo $? # 調(diào)用 test 判斷 /tmp 是否存在,并打印 test 的返回值
[ -f /tmp ]; echo $? # 和上面完全等價(jià),/tmp 肯定是存在的,所以輸出是 0

test cond && cmd1 # 判斷條件為真時(shí)執(zhí)行 cmd1
[ cond ] && cmd1 # 和上面完全等價(jià)
[ cond ] && cmd1 || cmd2 # 條件為真執(zhí)行 cmd1 否則執(zhí)行 cmd2

判斷 /etc/passwd 文件是否存在

經(jīng)典的 if 語句就是判斷后面的命令返回值為0的話,認(rèn)為條件為真,否則為假

if test -e /etc/passwd; then
echo "alright it exists ... "
else
echo "it doesn't exist ... "
fi

和上面完全等價(jià),[ 是個(gè)和 test 一樣的可執(zhí)行程序,但最后一個(gè)參數(shù)必須為 ]

這個(gè)名字為 "[" 的可執(zhí)行程序一般就在 /bin 或 /usr/bin 下面,比 test 優(yōu)雅些

if [ -e /etc/passwd ]; then
echo "alright it exists ... "
else
echo "it doesn't exist ... "
fi

和上面兩個(gè)完全等價(jià)

[ -e /etc/passwd ] && echo "alright it exists" || echo "it doesn't exist"

判斷變量的值

if [ "$varname" = "foo" ]; then
echo "this is foo"
elif [ "$varname" = "bar" ]; then
echo "this is bar"
else
echo "neither"
fi

復(fù)雜條件判斷,注意,小括號(hào)是字面量,實(shí)際輸入時(shí)前面要加反斜桿

if [ ( $x -gt 10 ) -a ( $x -lt 20 ) ]; then
echo "yes, between 10 and 20"
fi

可以用 && 命令連接符來做和上面完全等價(jià)的事情

[ ( $x -gt 10 ) -a ( $x -lt 20 ) ] && echo "yes, between 10 and 20"

判斷程序存在的話就執(zhí)行

[ -x /bin/ls ] && /bin/ls -l

如果不考慮兼容 posix sh 和 dash 這些的話,可用 bash 獨(dú)有的 ((..)) 和 [[..]]:

https://www.ibm.com/developerworks/library/l-bash-test/index.html

##############################################################################

流程控制:while / for / case / until

##############################################################################

while 循環(huán)

while condition; do
statements
done

i=1
while [ $i -le 10 ]; do
echo $i;
i=$(expr $i + 1)
done

for 循環(huán):上面的 while 語句等價(jià)

for i in {1..10}; do
echo $i
done

for name [in list]; do
statements
done

for 列舉某目錄下面的所有文件

for f in /home/*; do
echo $f
done

bash 獨(dú)有的 (( .. )) 語句,更接近 C 語言,但是不兼容 posix sh

for (( initialisation ; ending condition ; update )); do
statements
done

和上面的寫法等價(jià)

for ((i = 0; i < 10; i++)); do echo $i; done

case 判斷

case expression in
pattern1 )
statements ;;
pattern2 )
statements ;;

  • )
    otherwise ;;
    esac

until 語句

until condition; do
statements
done

select 語句

select name [in list]; do
statements that can use $name
done

##############################################################################

命令處理

##############################################################################

command ls # 忽略 ls 的任何 alias 直接執(zhí)行程序或者內(nèi)建命令
builtin cd # 忽略 cd 的任何 alias 直接運(yùn)行內(nèi)建的 cd 命令
enable # 允許或者禁止 bash 的內(nèi)建命令

eval $script # 對(duì) script 變量中的字符串求值(執(zhí)行)

##############################################################################

輸出/輸入 重定向

##############################################################################

cmd1 | cmd2 # 管道,將 cmd1 的標(biāo)準(zhǔn)輸出重定向到 cmd2 的標(biāo)準(zhǔn)輸入
< file # 將文件內(nèi)容重定向?yàn)槊畹臉?biāo)準(zhǔn)輸入

file # 將命令的標(biāo)準(zhǔn)輸出重定向到文件,會(huì)覆蓋文件

file # 將命令的標(biāo)準(zhǔn)輸出重定向到文件,追加不覆蓋
| file # 強(qiáng)制輸出到文件,即便設(shè)置過:set -o noclobber
n>| file # 強(qiáng)制將文件描述符 n的輸出重定向到文件
<> file # 同時(shí)使用該文件作為標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出
n<> file # 同時(shí)使用文件作為文件描述符 n 的輸出和輸入
n> file # 重定向文件描述符 n 的輸出到文件
n< file # 重定向文件描述符 n 的輸入為文件內(nèi)容
n>& # 將標(biāo)準(zhǔn)輸出 dup/合并 到文件描述符 n
n<& # 將標(biāo)準(zhǔn)輸入 dump/合并 定向?yàn)槊枋龇?n
n>&m # 文件描述符 n 被作為描述符 m 的一個(gè)副本,輸出用
n<&m # 文件描述符 n 被作為描述符 m 的一個(gè)副本,輸入用
&>file # 將標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤重定向到文件
<&- # 關(guān)閉標(biāo)準(zhǔn)輸入
&- # 關(guān)閉標(biāo)準(zhǔn)輸出
n>&- # 關(guān)閉作為輸出的文件描述符 n
n<&- # 關(guān)閉作為輸入的文件描述符 n

##############################################################################

文本處理 - cut

##############################################################################

cut -c 1-16 # 截取每行頭16個(gè)字符
cut -c 1-16 file # 截取指定文件中每行頭 16個(gè)字符
cut -c3- # 截取每行從第三個(gè)字符開始到行末的內(nèi)容
cut -d':' -f5 # 截取用冒號(hào)分隔的第五列內(nèi)容
cut -d';' -f2,10 # 截取用分號(hào)分隔的第二和第十列內(nèi)容
cut -d' ' -f3-7 # 截取空格分隔的三到七列
echo "hello" | cut -c1-3 # 顯示 hel
echo "hello sir" | cut -d' ' -f2 # 顯示 sir
ps | tr -s " " | cut -d " " -f 2,3,4 # cut 搭配 tr 壓縮字符

##############################################################################

文本處理 - awk / sed

##############################################################################

awk '{print $5}' file # 打印文件中以空格分隔的第五列
awk -F ',' '{print $5}' file # 打印文件中以逗號(hào)分隔的第五列
awk '/str/ {print $2}' file # 打印文件中包含 str 的所有行的第二列
awk -F ',' '{print $NF}' file # 打印逗號(hào)分隔的文件中的每行最后一列
awk '{s+=$1} END {print s}' file # 計(jì)算所有第一列的合
awk 'NR%3==1' file # 從第一行開始,每隔三行打印一行

sed 's/find/replace/' file # 替換文件中首次出現(xiàn)的字符串并輸出結(jié)果
sed -r 's/regex/replace/g' file # 替換文件中所有出現(xiàn)的字符串
sed -i 's/find/replace/g' file # 替換文件中所有出現(xiàn)的字符并且覆蓋文件
sed '/line/s/find/replace/' file # 先搜索行特征再執(zhí)行替換
sed -e 's/f/r/' -e 's/f/r' file # 執(zhí)行多次替換
sed 's#find#replace#' file # 使用 # 替換 / 來避免 pattern 中有斜桿
sed -i -r 's/^\s+//g' file # 刪除文件每行頭部空格
sed '/^$/d' file # 刪除文件空行并打印
sed -i 's/\s+$//' file # 刪除文件每行末尾多余空格

##############################################################################

排序 - sort

##############################################################################

sort file # 排序文件
sort -r file # 反向排序(降序)
sort -n file # 使用數(shù)字而不是字符串進(jìn)行比較
sort -t: -k 3n /etc/passwd # 按 passwd 文件的第三列進(jìn)行排序
sort -u file # 去重排序

##############################################################################

快速跳轉(zhuǎn) - https://github.com/rupa/z

##############################################################################

source /path/to/z.sh # .bashrc 中初始化 z.sh
z # 列出所有歷史路徑以及他們的權(quán)重
z foo # 跳到歷史路徑中匹配 foo 的權(quán)重最大的目錄
z foo bar # 跳到歷史路徑中匹配 foo 和 bar 權(quán)重最大的目錄
z -l foo # 列出所有歷史路徑中匹配 foo 的目錄
z -r foo # 按照最高訪問次數(shù)優(yōu)先進(jìn)行匹配跳轉(zhuǎn)
z -t foo # 按照最近訪問優(yōu)先進(jìn)行匹配跳轉(zhuǎn)

##############################################################################

鍵盤綁定

##############################################################################

bind '"\eh":"\C-b"' # 綁定 ALT+h 為光標(biāo)左移,同 CTRL+b / <Left>
bind '"\el":"\C-f"' # 綁定 ALT+l 為光標(biāo)右移,同 CTRL+f / <Right>
bind '"\ej":"\C-n"' # 綁定 ALT+j 為下條歷史,同 CTRL+n / <Down>
bind '"\ek":"\C-p"' # 綁定 ALT+k 為上調(diào)歷史,同 CTRL+p / <Up>
bind '"\eH":"\eb"' # 綁定 ALT+H 為光標(biāo)左移一個(gè)單詞,同 ALT-b
bind '"\eL":"\ef"' # 綁定 ALT+L 為光標(biāo)右移一個(gè)單詞,同 ALT-f
bind '"\eJ":"\C-a"' # 綁定 ALT+J 為移動(dòng)到行首,同 CTRL+a / <Home>
bind '"\eK":"\C-e"' # 綁定 ALT+K 為移動(dòng)到行末,同 CTRL+e / <End>
bind '"\e;":"ls -l\n"' # 綁定 ALT+; 為執(zhí)行 ls -l 命令

##############################################################################

有趣的命令

##############################################################################

man hier # 查看文件系統(tǒng)的結(jié)構(gòu)和含義
man test # 查看 posix sh 的條件判斷幫助
man ascii # 顯示 ascii 表
getconf LONG_BIT # 查看 32 位還是 64 位
bind -P # 列出所有 bash 的快捷鍵
mount | column -t # 漂亮的列出當(dāng)前加載的文件系統(tǒng)
curl if.cn # 取得外網(wǎng) ip 地址和服務(wù)商信息
disown -a && exit # 關(guān)閉所有后臺(tái)任務(wù)并退出
cat /etc/issue # 查看 Linux 發(fā)行版信息
lsof -i port:80 # 哪個(gè)程序在使用 80 端口?
showkey -a # 取得按鍵的 ASCII 碼
svn diff | view - # 使用 Vim 來顯示帶色彩的 diff 輸出
mv filename.{old,new} # 快速文件改名
time read # 使用 CTRL-D 停止,最簡單的計(jì)時(shí)功能
cp file.txt{,.bak} # 快速備份文件
sudo touch /forcefsck # 強(qiáng)制在下次重啟時(shí)掃描磁盤
find ~ -mmin 60 -type f # 查找 $HOME 目錄中,60 分鐘內(nèi)修改過的文件
curl wttr.in/~beijing # 查看北京的天氣預(yù)報(bào)
echo ${SSH_CLIENT%% *} # 取得你是從什么 IP 鏈接到當(dāng)前主機(jī)上的
echo $[RANDOM%X+1] # 取得 1 到 X 之間的隨機(jī)數(shù)
bind -x '"\C-;":ls -l' # 設(shè)置 CTRL+C 為執(zhí)行 ls -l 命令
find / -type f -size +5M # 查找大于 5M 的文件
chmod --reference f1 f2 # 將 f2 的權(quán)限設(shè)置成 f1 一模一樣的

##############################################################################

常用技巧

##############################################################################

列出最常使用的命令

history | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head

通過 SSH 來 mount 文件系統(tǒng)

sshfs name@server:/path/to/folder /path/to/mount/point

顯示前十個(gè)運(yùn)行的進(jìn)程并按內(nèi)存使用量排序

ps aux | sort -nk +4 | tail

在右上角顯示時(shí)鐘

while sleep 1;do tput sc;tput cup 0 $(($(tput cols)-29));date;tput rc;done&

從網(wǎng)絡(luò)上的壓縮文件中解出一個(gè)文件來,并避免保存中間文件

wget -qO - "http://www.tarball.com/tarball.gz" | tar zxvf -

性能測試:測試處理器性能

python -c "import test.pystone;print(test.pystone.pystones())"

性能測試:測試內(nèi)存帶寬

dd if=/dev/zero of=/dev/null bs=1M count=32768

Linux 下掛載一個(gè) iso 文件

mount /path/to/file.iso /mnt/cdrom -oloop

通過主機(jī) A 直接 ssh 到主機(jī) B

ssh -t hostA ssh hostB

下載一個(gè)網(wǎng)站的所有圖片

wget -r -l1 --no-parent -nH -nd -P/tmp -A".gif,.jpg" http://example.com/images

快速創(chuàng)建項(xiàng)目目錄

mkdir -p work/{project1,project2}/{src,bin,bak}

按日期范圍查找文件

find . -type f -newermt "2010-01-01" ! -newermt "2010-06-01"

顯示當(dāng)前正在使用網(wǎng)絡(luò)的進(jìn)程

lsof -P -i -n | cut -f 1 -d " "| uniq | tail -n +2

Vim 中保存一個(gè)沒有權(quán)限的文件

:w !sudo tee > /dev/null %

##############################################################################

有用的函數(shù)

##############################################################################

自動(dòng)解壓:判斷文件后綴名并調(diào)用相應(yīng)解壓命令

function q-extract() {
if [ -f $1 ] ; then
case $1 in
*.tar.bz2) tar -xvjf $1 ;;
*.tar.gz) tar -xvzf $1 ;;
*.tar.xz) tar -xvJf $1 ;;
*.bz2) bunzip2 $1 ;;
*.rar) rar x $1 ;;
*.gz) gunzip $1 ;;
*.tar) tar -xvf $1 ;;
*.tbz2) tar -xvjf $1 ;;
*.tgz) tar -xvzf $1 ;;
*.zip) unzip $1 ;;
*.Z) uncompress $1 ;;
*.7z) 7z x $1 ;;
*) echo "don't know how to extract '$1'..." ;;
esac
else
echo "'$1' is not a valid file!"
fi
}

自動(dòng)壓縮:判斷后綴名并調(diào)用相應(yīng)壓縮程序

function q-compress() {
if [ -n "$1" ] ; then
FILE=$1
case $FILE in
.tar) shift && tar -cf $FILE $ ;;
.tar.bz2) shift && tar -cjf $FILE $ ;;
.tar.xz) shift && tar -cJf $FILE $ ;;
.tar.gz) shift && tar -czf $FILE $ ;;
.tgz) shift && tar -czf $FILE $ ;;
.zip) shift && zip $FILE $ ;;
.rar) shift && rar $FILE $ ;;
esac
else
echo "usage: q-compress <foo.tar.gz> ./foo ./bar"
fi
}

##############################################################################

References

##############################################################################

http://www.linuxstall.com/linux-command-line-tips-that-every-linux-user-should-know/
https://github.com/LeCoupa/awesome-cheatsheets/blob/master/languages/bash.sh
https://ss64.com/bash/syntax-keyboard.html
http://wiki.bash-hackers.org/commands/classictest
https://www.ibm.com/developerworks/library/l-bash-test/index.html
https://www.cyberciti.biz/faq/bash-loop-over-file/
https://linuxconfig.org/bash-scripting-tutorial
https://devhints.io/bash

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容