Linux Bash


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>

注:

  1. [-p] 指定端口號,默認為 22
  2. [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>

注:

  1. 當使用這兩個任務時,如果提示 no job control in this shell ,可以使用 set -m 命令開啟。
  2. 當一個任務進程在執行過程中想要暫時掛起,可以使用 ctrl + Z ,若要終止,進入 suspended 狀態,使用 ctrl + C ,進入terminated 狀態。
  3. 掛起的任務可以通過 fg 重新調到前台運行,或者通過 bg 調到后台運行。
  4. 若要終止掛起的任務,可以使用 kill <pid>

& 字符的作用

用途:

放在啟動參數后面表示設置此進程為后台進程,這是稱之為 job。通過 jobs

命令可以查看當前有多少后台運行的命令。

示例:

> ./run.sh &
> jobs -l

注:

  1. [-l] 顯示pid。

nohup 保住進程

當用戶關閉窗口時,終端會受到HUP(hungup)信號,從而關閉其所有子進程。

若要讓命令不被終止,有兩種處理方式:

  1. 讓進程忽略HUP信號, nohup 之所為
  2. 讓進程運行在新的會話中,setsid(<cmd> &)之所為

示例:

> nohup ping www.ibm.com &
> setsid ping www.ibm.com
> (ping www.ibm.com &)
> ps -ef | grep www.ibm.com

如果事前沒有使用前面的方式保住進程,那么可以使用如下流程進行補救:

  1. ctrl+Z 掛起進程,使用 jobs -l 獲取進程號;
  2. 使用 bg <pid> 將其放入后台運行;
  3. 再使用 disown <pid> ,可以避免 HUP 信號的影響。

使用 nohup 命令時默認會將輸出保存到文件 nohup.ou ,可以通過以下方式修改保存文件

> nohup ${my_app} > common.out 2> error.out
> nohup ${my_app} > all_in.out &

ps 進程快照

process status, 列出當前運行的進程的快照。命令參數:

  1. [-A] 顯示所有進程;
  2. [-e] 顯示環境變量;
  3. [-f] 顯示程序間的關系;
  4. [-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 終止進程

終止進程的命令,參數有:

  1. [-9] 強制刪除;

文件管理命令

tail 查看文件末尾

> tail [-n <line numbers>] [-f] <file>

注:

  1. [-n] 可以指定顯示的日志行數,不指定默認為 10 行
  2. [-f] 可以監視文件的增長,簡縮的命令為 tailf
  3. 與之相對應的顯示前面幾條日志的命令為 head

cat 一次顯示文件內容

> cat [-ns] <file>...

注:

  1. [-n] 可以顯示行號
  2. [-s] 可以合並連續的空行為一
  3. 與之相對的命令為 tac 可以從尾到頭顯示文件內容(Mac 好像不支持)

示例:

# 一次顯示整個文件
cat <file1> <file2>
# 創建新文件
cat > <file>
# 將多個文件合並為一個文件
cat <file1> <file2> > <file> 

more 逐頁顯示文件內容

> more [-s] [-<line numbers>] [+<line numbers>] <file>

注:

  1. [-s] 可以合並連續的空行為一
  2. [-n] 可以定義每次上滾 n 行
  3. [+n] 可以指定從第 n 行開始顯示
  4. ctrl +F 向上滾動一屏,空格鍵 向下滾動一屏
  5. = 顯示當前顯示的行數范圍及文件名稱

示例:

# 從第 100 行開始顯示 debug.log, 每次滾動 10 行,合並空行為一
> more -s -10 +100 debug.log

less 分頁顯示文件內容

more 強大的真正意義上的分頁查看文件命令,more 一次會加載整個文件,而 less 是逐頁加載。less 還支持向上翻頁和搜索。

> less [-gimNsS] [-x <numbers>] <file>

注:

  1. [-g] 高亮先前的搜索結果
  2. [-i] 搜索時忽略大小寫
  3. [-m] 顯示已顯示內容的百分比
  4. [-N] 顯示行號
  5. [-s] 合並顯示連續的空行為一
  6. [-S] 行過長時舍棄超出部分
  7. [-x 4] 設置tab 為規定的數量的空格
  8. / 向上查找
  9. ? 向下查找
  10. n 正向重復查找
  11. N 反向重復查找
  12. b 向后翻一頁
  13. d 向后翻半頁
  14. y 向前翻一頁
  15. u 向前翻半頁
  16. q 退出

示例:

# 查找歷史命令中包含run的命令
> history | less
/run
# 假設找到要運行的命令序號為 100,按 q 退出,再按如下重新執行
> !100

grep 查找文件內容

grep (global search regular expression(RE) and print out the line,全面搜索正則表達式並把行打印出來)

> grep <option> <file>...
  1. [-A num] 顯示匹配行后面 num 行
  2. [-B num] 顯示匹配行前面 num 行
  3. [-C num] 顯示匹配行前后各 num 行
  4. [--color=auto] 匹配結果自動配色
  5. [-m num] 當匹配了 num 行后不再繼續查找
  6. [-n] 顯示匹配行所在行號
  7. [-v] --invert-match 輸出不匹配的行
  8. [-i] 不區分大小寫
  9. [-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 壓縮。

命令參數:

  1. [-x] --extract 解開 tar 文件
  2. [-z] --gzip,--gunzip,--unzip 調用 gzip 執行壓縮或解壓縮
  3. [-f] --file 指定要處理的文件名
  4. [-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

限制:

  1. Linux 環境;
  2. 安裝了 jstack,Amazon Linux 默認沒有該工具,需要通過 sudo yum install java-1.8.0-devel 安裝。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM