SET 命令
用途:
可以設置 shell 的執行方式,不帶參數時輸出環境變量。
> set [+-abCdefhHklmnpPtuvx]
注:
1. [-] 表示設置參數
2. [+] 表示取消設置參數
示例:
> tmp="nice day"
> $tmp
nice day
> set | grep tmp
tmp="nice day"
> unset tmp
> $tmp
SSH 命令
用途:
連接遠程計算機。
> ssh -p <port> <user>@<hostname> <remote cmd>
注:
- [-p] 指定端口號,默認為 22
- [remote cmd] 遠程執行命令並顯示到本地繼續工作
配置 [.ssh] 在 [~/.ssh/config] 中,
Host <myhost>
User <username>
HostName <ip>
IdentityFile ~/env/<username>.id_rsa
可快速進行ssh連接,ssh myhost
。
SSHPASS 命令
不用提示輸入密碼,直接使用配置的密碼進行遠程登錄,適用於腳本。
安裝:
# Ubuntu
apt-get install sshpass
# Mac
brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb
進程管理命令
前后台切換命令 bg、fg
> fg <task id>
> bg <task id>
注:
- 當使用這兩個任務時,如果提示
no job control in this shell
,可以使用set -m
命令開啟。 - 當一個任務進程在執行過程中想要暫時掛起,可以使用
ctrl + Z
,若要終止,進入suspended
狀態,使用ctrl + C
,進入terminated
狀態。 - 掛起的任務可以通過
fg
重新調到前台運行,或者通過bg
調到后台運行。 - 若要終止掛起的任務,可以使用
kill <pid>
。
& 字符的作用
用途:
放在啟動參數后面表示設置此進程為后台進程,這是稱之為 job。通過 jobs
命令可以查看當前有多少后台運行的命令。
示例:
> ./run.sh &
> jobs -l
注:
- [-l] 顯示pid。
nohup 保住進程
當用戶關閉窗口時,終端會受到HUP(hungup)信號,從而關閉其所有子進程。
若要讓命令不被終止,有兩種處理方式:
- 讓進程忽略HUP信號,
nohup
之所為 - 讓進程運行在新的會話中,
setsid
、(<cmd> &)
之所為
示例:
> nohup ping www.ibm.com &
> setsid ping www.ibm.com
> (ping www.ibm.com &)
> ps -ef | grep www.ibm.com
如果事前沒有使用前面的方式保住進程,那么可以使用如下流程進行補救:
- 先
ctrl+Z
掛起進程,使用jobs -l
獲取進程號; - 使用
bg <pid>
將其放入后台運行; - 再使用
disown <pid>
,可以避免 HUP 信號的影響。
使用 nohup
命令時默認會將輸出保存到文件 nohup.ou
,可以通過以下方式修改保存文件
> nohup ${my_app} > common.out 2> error.out
> nohup ${my_app} > all_in.out &
ps 進程快照
process status, 列出當前運行的進程的快照。命令參數:
- [-A] 顯示所有進程;
- [-e] 顯示環境變量;
- [-f] 顯示程序間的關系;
- [-aux] 顯示所有包含其他使用者的進程。
查找特定的名稱的進程時通常與 grep 命令連用,以查找 Wechat 相關進程為例:
# 將所有進程中的包含 Wechat 的連同表頭一起輸出
> ps -ef | grep -Ei 'PID|Wechat'
在我的電腦上輸出結果是:
UID PID PPID C STIME TTY TIME CMD
501 1079 1 0 Thu10AM ?? 3:23.55 /Applications/WeChat.app/Contents/MacOS/WeChat
kill 終止進程
終止進程的命令,參數有:
- [-9] 強制刪除;
文件管理命令
tail 查看文件末尾
> tail [-n <line numbers>] [-f] <file>
注:
- [-n] 可以指定顯示的日志行數,不指定默認為 10 行
- [-f] 可以監視文件的增長,簡縮的命令為
tailf
- 與之相對應的顯示前面幾條日志的命令為
head
cat 一次顯示文件內容
> cat [-ns] <file>...
注:
- [-n] 可以顯示行號
- [-s] 可以合並連續的空行為一
- 與之相對的命令為
tac
可以從尾到頭顯示文件內容(Mac 好像不支持)
示例:
# 一次顯示整個文件
cat <file1> <file2>
# 創建新文件
cat > <file>
# 將多個文件合並為一個文件
cat <file1> <file2> > <file>
more 逐頁顯示文件內容
> more [-s] [-<line numbers>] [+<line numbers>] <file>
注:
- [-s] 可以合並連續的空行為一
- [-n] 可以定義每次上滾 n 行
- [+n] 可以指定從第 n 行開始顯示
ctrl +F
向上滾動一屏,空格鍵
向下滾動一屏=
顯示當前顯示的行數范圍及文件名稱
示例:
# 從第 100 行開始顯示 debug.log, 每次滾動 10 行,合並空行為一
> more -s -10 +100 debug.log
less 分頁顯示文件內容
比 more
強大的真正意義上的分頁查看文件命令,more
一次會加載整個文件,而 less
是逐頁加載。less
還支持向上翻頁和搜索。
> less [-gimNsS] [-x <numbers>] <file>
注:
- [-g] 高亮先前的搜索結果
- [-i] 搜索時忽略大小寫
- [-m] 顯示已顯示內容的百分比
- [-N] 顯示行號
- [-s] 合並顯示連續的空行為一
- [-S] 行過長時舍棄超出部分
- [-x 4] 設置
tab
為規定的數量的空格 /
向上查找?
向下查找n
正向重復查找N
反向重復查找b
向后翻一頁d
向后翻半頁y
向前翻一頁u
向前翻半頁q
退出
示例:
# 查找歷史命令中包含run的命令
> history | less
/run
# 假設找到要運行的命令序號為 100,按 q 退出,再按如下重新執行
> !100
grep 查找文件內容
grep (global search regular expression(RE) and print out the line,全面搜索正則表達式並把行打印出來)
> grep <option> <file>...
- [-A num] 顯示匹配行后面 num 行
- [-B num] 顯示匹配行前面 num 行
- [-C num] 顯示匹配行前后各 num 行
- [--color=auto] 匹配結果自動配色
- [-m num] 當匹配了 num 行后不再繼續查找
- [-n] 顯示匹配行所在行號
- [-v] --invert-match 輸出不匹配的行
- [-i] 不區分大小寫
- [-E] --extended-regexp 支持擴展的正則表達式
示例:
# 查詢日志文件中包含 keyword 但不含 keywords 的行,最多輸出 10 行匹配,且顯示匹配行前后 2 行
> grep -C 2 -n -m 10 keyword *.log | grep -v keywords
# 同時查找多個關鍵字
> grep -E 'a_key|b_key' a.file
tar 解壓縮文件
tar 最初的設計目的是將文件備份到磁帶上(tape archie),故名 tar。
tar 代表未壓縮的 tar 文件,已經壓縮的 tar 文件會附加壓縮文件的擴展名,如 .tar.gz
表示經過 gzip 壓縮。
命令參數:
- [-x] --extract 解開 tar 文件
- [-z] --gzip,--gunzip,--unzip 調用 gzip 執行壓縮或解壓縮
- [-f] --file 指定要處理的文件名
- [-t] --list 列出 tar 文件中包含的文件的信息
# 解壓 .tar.gz 文件到當前文件夾
> tar -zxf a_file.tar.gz
# 解壓 .tar 文件到 tmp 文件夾
> tar -xf b_file.tar -C tmp/
# gzip 壓縮文件 c_file 和目錄 d_dir 到 out.tar.gz
> tar -czvf out.tar.gz c_file d_dir
gunzip 解壓文件
gzip -d all.gz
gunzip all.gz
awk 文本分析
文本處理語言和工具,用於在文件中查找與模式匹配的行並在這些行上執行指定的操作,名稱取自三位創始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。可參見 AWK程序設計語言 、 awk命令 - IBM 以及 Linux awk 命令 - runoob.com 進行完整的學習。下面簡單介紹下語法:
> awk '{[pattern] action}' {filenames} # 行匹配語句 awk '' 只能用單引號
Pattern 支持:
- 正則表達式,eg.
awk '/smith?/' a_file
- 關系表達式,eg.
awk '$1 > $3' b_file
- 模式的組合,以上模式的組合
- 與或非
|| && !
,值為真則匹配 - 圓括號
()
,組合匹配 - 逗號
,
,匹配前一個的匹配
- 與或非
- BEGIN 和 END 模式
- BEGIN 模式在讀取輸入前執行
- END 模式在讀取輸入后執行
示例:
# 指定分隔符(默認是空格或 TAB),有兩種寫法
## 用逗號分割
> awk -F, '{print $3}' a_file
> awk 'BEGIN{FS=","} {print $3}' a_file
## 先用空格分割再用逗號分割
> awk -F '[ ,]' '{print $3}' a_file
> awk 'BEGIN{FS="[ ,]"} {print $3}' a_file
# 忽略匹配文本的大小寫
> awk 'BEGIN{IGNORECASE=1} /a_key/' a_file
# 獲取 Kafka 進程的 ID
> ps aux | grep server.properties | grep -v grep | awk '{print $2}'
sed
alias 添加別名
樹狀查看文件:
# 注意:這種方式會列出所有文件,建議使用 brew instal tree. 因為可以使用 `tree -L [depth]`自定義深度
> alias tree="find . -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'"
> source ~/.zshrc
取消別名:
> unalias tree
ctrl 移動光標
Windows 快捷鍵 | Mac 快捷鍵 | 功能 |
---|---|---|
ctrl + 左右鍵 | option + 左右鍵 | 在單詞之間跳轉 |
ctrl + a | 同左 | 跳到本行的行首 |
ctrl + e | 同左 | 跳到頁尾 |
ctrl + u | 同左 | 刪除當前光標前面的文字 |
ctrl + k | 同左 | 刪除當前光標后面的文字 |
ctrl + w、ctrl + d | 同左 | 對於當前的單詞進行刪除操作,w刪除光標前面的單詞的字符,d則刪除后面的字符 |
ctrl + y | 同左 | 恢復刪除的文字 |
ctrl + l | 同左 | 清屏 |
同步一台服務器中的文件到另一台
基本思路:拷貝文件到本地,然后覆蓋另一台上的同名文件。命令如下,其中 server-a
以及 server-b
是定義在文件 ~/.ssh/config
中的 HOST
。
ssh server-a "cat ~/test.txt" > ~/Desktop/test.txt;scp ~/Desktop/run.sh server-b:~/test.txt
# scp
scp root@172.34.2.7:/root/apps/web/app.mdeploy.config ~/Downloads
Tree 命令中文亂碼
tree -N folder
更改文件訪問權限
以下摘引自 鳥哥的 Linux 私房菜 第六章,略有刪減。
(1)數字類型改變文件權限
Linux文件的基本權限就有九個,分別是 owner/group/others
三種身份各有自己的 read/write/execute
權限,文件的權限字符為:-rwxrwxrwx
, 這九個權限是三個三個一組的!其中,我們可以使用數字來代表各個權限,各權限的分數對照表如下:
r:4
w:2
x:1
每種身份( owner/group/others
)各自的三個權限( r/w/x
)分數是需要累加的,例如當權限為: [-rwxrwx---]
分數則是
owner = rwx = 4+2+1 = 7
group = rwx = 4+2+1 = 7
others= --- = 0+0+0 = 0
變更權限的指令chmod的語法是這樣的:
chmod [-R] xyz 文件或目錄
選項與參數:
- xyz : 就是剛剛提到的數字類型的權限屬性,為 rwx 屬性數值的相加。
- -R : 進行遞歸(recursive)的持續變更,亦即連同次目錄下的所有文件都會變更。
(2)符號類型改變文件權限
還有一個改變權限的方法呦!從之前的介紹中我們可以發現,基本上就九個權限分別是 (1)user (2)group (3)others
三種身份啦!那么我們就可以藉由 u, g, o
來代表三種身份的權限!此外, a
則代表 all 亦即全部的身份!那么讀寫的權限就可以寫成 r, w, x
!也就是可以使用底下的方式來看:
格式 | chmod | u g o a | +(加入) -(除去) =(設定) | r w x | 文件或目錄 |
---|---|---|---|---|---|
例子 | chmod | a | = | r | .bashrc |
來實作一下吧!假如我們要設定一個文件的權限成為-rwxr-xr-x
時,基本上就是:
- user (u):具有可讀、可寫、可執行的權限;
- group 與 others (g/o):具有可讀與執行的權限。
chmod u=rwx,go=rx .bashrc
# 注意喔!那個 u=rwx,go=rx 是連在一起的,中間並沒有任何空格!
chmod a+w .bashrc
# 增加.bashrc這個文件的每個人均可寫入的權限
正則方式刪除文件(Delete files with regular expression)
偶然間,使用 ll
命令發現桌面上有許多 ~$
開頭的文件,是用微軟三件套打開后暫存文件,原文件已經刪除了,可這暫存文件還隱存在桌面上,於是想要批量刪除它們。
# 在當前目錄找到以 “~$” 開頭的文件,然后執行刪除操作
find . -name "~\$*" -delete
wget 下載文件
wget "http://mirrors.hust.edu.cn/apache/kafka/2.1.0/kafka_2.11-2.1.0.tgz"
不下載文件,只控制台輸出
wget -qO- $url
使用 Post 請求
wget --post-data="$post-data" $url
wget --post-file="$post-file" $url
查看系統信息
# 查看內核/操作系統/CPU信息
uname -a
# 查看操作系統版本
head -n 1 /etc/issue
# 查看CPU信息
cat /proc/cpuinfo
# 查看計算機名
hostname
# 查看環境變量
env
# 查看內存使用量和交換區使用量
free -m
# 查看各分區使用情況
df -h
# 查看指定目錄的大小
du -sh <目錄名>
# 查看內存總量
grep MemTotal /proc/meminfo
# 查看空閑內存量
grep MemFree /proc/meminfo
# 查看系統運行時間、用戶數、負載
uptime
# 查看系統負載
cat /proc/loadavg
# 查看所有磁盤分區
fdisk -l
讓系統的 CPU 變高
for i in `seq 1 $(cat /proc/cpuinfo |grep "physical id" |wc -l)`; do dd if=/dev/zero of=/dev/null & done
排查占用 CPU 高的 Java 線程
使用 https://github.com/oldratlee/useful-scripts 即可,命令如下:
sh show-busy-java-threads
限制:
- Linux 環境;
- 安裝了 jstack,Amazon Linux 默認沒有該工具,需要通過
sudo yum install java-1.8.0-devel
安裝。