Linux

終端快捷鍵

光標移動

快捷鍵

作用

crtl+a

移動到開頭

crtl+e

移動到結尾

alt+b

向左移動一個單詞

alt+f

向右移動一個單詞

crtl+b

向左移動一個字符

crtl+f

向右移動一個字符

esc+b

向左移動一個單詞

esc+f

向右移動一個單詞

ctrl+XX

在上次光標和當前光標所在字符間跳轉

esc+t

交換光標位置錢的兩個單詞

刪除

快捷鍵

作用

ctrl+k

刪除光標後所有字符

ctrl+u

刪除光標前所有字符

ctrl+w

刪除光標前一個單詞

ctrl+d

刪除光標所在字符(右側)

ctrl+h

刪除光標前字符(左側)

撤銷

快捷鍵

作用

ctrl+_

撤銷操作

ctrl+y

粘貼ctrl+u/k剪切的內容

ctrl+?

撤銷前一次輸入

alt+r

撤銷前一次動作

替換

快捷鍵

作用

ctrl+t

將光標當前字符與前一個字符替換

歷史命令編輯

快捷鍵

作用

ctrl+p

上一條歷史命令

ctrl+n

下一條歷史命令

alt+>

上一次執行的命令的最後一個單詞

ctrl+r

搜索歷史命令

控制命令

快捷鍵

作用

ctrl+l

清除屏幕

ctrl+s

鎖住終端,阻止屏幕輸出

ctrl+q

解鎖終端,允許屏幕輸出

ctrl+c

終止命令

ctrl+i

補全,相當於tab

ctrl+o

重複執行命令

alt+<數字>

操作的次數

ctrl+z

掛起

!命令

快捷

作用

!!

執行上條命令

!-n

執行前n條命令

shell中的 $ 用法

特殊符號

含義

$#

傳給腳本的參數個數

$0

shell腳本文件的名字

$1

傳遞給該shell腳本的第一個參數

$2

傳遞給該shell腳本的第二個參數

$@

傳給腳本的所有參數的列表

$*

以一個單字符串顯示所有向腳本傳遞的參數,與位置變量不同,參數可超過9個

$$

腳本運行的當前進程ID號,Shell本身的PID

$?

顯示最後命令的退出狀態,0表示沒有錯誤,其他表示有錯誤

$!

Shell最後運行的後台Process的PID

$-

使用Set命令設定的Flag一覽

$()

相當於``,括號中放的是命令

${}

括號中放的是變量。例如echo P A T H 取 P A T H 變 量 的 值 並 打 印 , 也 可 以 不 加 括 號 比 如 {PATH}取PATH變 量的值並打印,也可以不加括號比如PATH取PATH變量的值並打印,也可以不加括號比如PATH。

$1~n

添加到Shell的各參數值。$1是第1參數、$2是第2參數…。

${}的特殊用法

# sh, dash 都不能使用該語法
# 基礎語法:${parameter,,pattern} / ${parameter^^pattern}
# 另外這個語法不會改變原變量
var="Hello,World"
# 第一個字符變為大寫
echo ${var^}
# 所有字符變為大寫
echo ${var^^}
# 第一個字符變為小寫
echo ${var,}
# 所有字符變為小寫
echo ${var,,}

判斷/比較

語法(用例)

if [ $SYSTEM = "Linux" ] ; then # 如果是linux話輸出linux字符串
echo "Linux"
elif [ $SYSTEM = "FreeBSD" ] ; then
echo "FreeBSD"
elif [ $SYSTEM = "Solaris" ] ; then
echo "Solaris"
else
echo "What?"
fi # 判斷結束,以fi結尾

字符串判斷

語法

含義

str1 = str2

當兩個串有相同內容、長度時為真

str1 != str2

當串str1和str2不等時為真

-n str1

當串的長度大於0時為真(串非空)

-z str1

當串的長度為0時為真(空串)

str1

當串str1為非空時為真

數字的判斷

語法

含義

int1 -eq int2

兩數相等為真

int1 -ne int2

兩數不等為真

int1 -gt int2

int1大於int2為真

int1 -ge int2

int1大於等於int2為真

int1 -lt int2

int1小於int2為真

int1 -le int2

int1小於等於int2為真

文件相關的if判斷條件語句

語法

含義

-r file

用户可讀為真

-w file

用户可寫為真

-x file

用户可執行為真

-f file

文件為正規文件為真

-d file

文件為目錄為真

-c file

文件為字符特殊文件為真

-b file

文件為塊特殊文件為真

-s file

文件大小非0時為真

-t file

當文件描述符(默認為1)指定的設備為終端時為真

複雜邏輯判斷

語法

含義

-a


-o


!


[] 和 [[]] 的區別

if [[]] 要求括號裏的表達式前後必須有一個空格,格式如 if [[ xxx ]]。
當 if [[]] 用於字符串常量或變量比較時,表達式本身的運算符,如 <、>、==、!= ,其前後可以不加空格;
但當 if [[]] 用於數值比較時,表達式本身的運算符前後必須加空格,否則會得到相反的結果。

如:

if [[ $1 != "start"  &&  $1 != "stop" ]]

在if之後要用空格,[[ 之後要有一個空格,]]之前要有空格,不然會出錯.

elif [[ $1 == "stop" ]] 

雙等號兩邊要有空格不然後會出錯.

在shell中查看每條指令實際執行的結果

set +x表示開始記錄,set -x表示停止記錄。

例子:

set +x
name="test"
echo $name
set -x

實用小技巧

查找包含某個字符串的所有文件,可以用於後續的自動處理:

# 指令
grep -r "desktop\." | awk '{print $1}' | sed 's/://g' | uniq
# 用途
for script_name in `grep -r "desktop\." | awk '{print $1}' | sed 's/://g' | uniq`
do
	echo y | edopkg pull $script_name
done

日誌管理

dmesg命令可以查看系統的整個啓動日誌

GIT

批量刪除已合併分支

# 獲取已合併分支
git branch --merged
# 篩選去除指定字符串(正則方式)
grep -i -v -E "master|dev"
# 以字符串結尾的
grep -i -v -E "x-master$|x-develop$|x-release$"
# 批量執行(要用管道)
xargs git branch -d
# 合起來
git branch --merged | grep -i -v -E "x-master$|x-develop$|x-release$" | xargs git branch -d

刪除遠程跟蹤分支

git remote prune origin

修改當前commit

git add . && git commit --amend --no-edit

該操作會修改當前最新commit並添加當前目錄下所有修改了但未提交的文件。
如果最新commit已經push到遠端,則需要再次強制推送到遠端。

查找某個commit被哪個branch和tag包含

查找被包含的branch:git branch --contains commit_id --all查找被包含的tag:git tag --contains tag_name

設置命令別名

git config --global alias.a add
git config --global alias.c commit
git config --global alias.o checkout

也可以在config文件進行修改和查看,
~/.gitconfig或項目的.git/config文件中,有以下信息,可以進行修改:

[alias]
a = add
c = commit
o = checkout
# ...

還可以直接用別人寫好的:
項目地址使用方法:

  1. 首先將該開源項目中的gitalias.txt文件下載下來
  2. 然後在.gitconfig文件裏面加入:
[include]
path = gitalias.txt

獲取兩個commit之間更改的文件

可以方便在shell或者bash中執行自動化操作

以最新的更新為例:git diff --name-only HEAD HEAD^執行自動化操作:for fp in `git diff --name-only HEAD HEAD^`; do echo $fp; done

Docker

刪除虛懸鏡像:docker images --filter dangling=true刪除所有虛懸鏡像:

docker rmi $(docker images --filter dangling=true -q)
# 或
docker image prune
# 刪除24小時前的虛懸鏡像,-a 標籤還支持刪除所有未使用的鏡像
docker image prune -f --filter until=24h

列出latest鏡像之前的所有鏡像:docker images aka-gm --filter before=aka-gm:latest從以上輸出中取出鏡像的REPOSITORY與TAG:docker images aka-gm --filter before=aka-gm:latest --format "{{.Repository}}:{{.Tag}}"排除TAG為的鏡像並刪除:docker images aka-gm -f before=aka-gm:latest | grep aka-gm | grep -v "<none>" | awk '{printf "%s:%s\n",$1,$2}' | xargs -r docker rmi刪除TAG為的鏡像:docker images aka-gm -f before=aka-gm:latest | grep "<none>" | awk '{printf "%s:%s\n",$1,$2}' | xargs -r docker rmi

找出容器對應的日誌濾鏡:docker inspect --format='{{.LogPath}}' containername