bash 命令行學習筆記

命令行學習筆記

該文檔爲linux bash 命令行學習的筆記摘要,用於記錄基本的命令行操做,以及技巧,參考學習連接以下

https://github.com/jlevy/the-art-of-command-line/blob/master/README-zh.mdnode

1、基礎

1.文本編輯器emacs操做筆記

詳見emacs 內置教程python

2.輸出輸入重定向以及管道命令、標準輸入標準輸出標準錯誤

  • 標準輸入(stdin) -0 、標準輸出(stdout)-1 、標準錯誤(stderr)-2
  • 標準輸入重定向 cat < in.txt
  • 標準輸出重定向 覆蓋模式:> 追加模式:>>
  • 將標準輸出重定向到特定文件 echo "123" > out.txt
  • 將標準錯誤重定向到特定文件 cmd 2>error.txt
  • 將標準輸出和標準錯誤定向到不一樣文件 cmd 1>out.txt 2>err.txt
  • 將標準輸出和標準錯誤重定向到同一個文件 cmd >out_err.txt 2>&1
  • /dev/null 是一個特殊的文件,寫入到它的內容都會被丟棄;若是嘗試從該文件讀取內容,那麼什麼也讀不到。可是 /dev/null 文件很是有用,將命令的輸出重定向到它,會起到"禁止輸出"的效果,如$ command > /dev/null 2>&1

3.bash的任務管理工具: &,ctrl-z,ctrl-c,jobs,fg,bg,kill

  • & 表示把任務放在後臺運行 python test.py > log.txt & 運行test.py程序,並置於後臺運行,日誌信息重定向到log.txt
  • ctrl+c 是強制中斷程序的執行。
  • ctrl+z 的是將任務中斷,可是此任務並無結束,他仍然在進程中他只是維持掛起的狀態。
  • fg 從新啓動被前臺中斷的任務,把後臺的命令調至前臺繼續運行 fg %job_num
  • bg 將後臺中斷的進程繼續運行
  • jobs 查看當前有多少在後臺運行的命令
  • kill 殺掉進程,只有第9種信號(SIGKILL)才能夠無條件終止進程,其餘信號進程都有權利忽略。下面是經常使用的信號:
  1. HUP 1 終端斷線
  2. INT 2 中斷(同 Ctrl + C)
  3. QUIT 3 退出(同 Ctrl + \)
  4. TERM 15 終止
  5. KILL 9 強制終止
  6. CONT 18 繼續(與STOP相反, fg/bg命令)
  7. STOP 19 暫停(同 Ctrl + Z)
  • pgrep 和 pkill 根據名字查找進程或發送信號

4.利用ssh進行遠程登陸

密碼登陸 ssh -p port username@webserverip
密鑰登陸 ssh -i ~/.ssh/id_rsa_1 username@webserverip
利用ssh-keygen 生成密鑰對,公密: ../.ssh/id_rsa.pub 私密:../.ssh/id_rsa 將公密放到服務器linux

ssh 配置文件 etc/ssh/sshd_config 設置端口,設置是否容許密碼登陸、是否須要進行密鑰驗證等ios

Port 32200
RSAAuthentication yes
PubkeyAuthentication yes

5.基本的文件管理工具使用

less、 head、tail、 tail -f、 ln 和 ln -s 、chown、 chmod、 du 、df 、fdisk 、mkfs、 lsblk ,inode
ln 硬鏈接
ln -s 軟鏈接git

6.基本的網絡管理工具 ifconfig

ifconfig 查看網絡內容,啓動或者關掉網卡,修改網絡ip,修改mac地址功能github

7.版本控制工具git

8.熟悉正則表達式,使用grep,學習參數 -i,-o -v -A -B -C

grep 命令用於查找文件裏符合條件的字符串,參數以下:

  • -i 忽略大小寫
  • -o 只顯示匹配的內容
  • -v 不匹配符合的內容
  • -A 除了顯示匹配的內容以外,還顯示該行以前的n行
  • -B 除了顯示匹配的內容以外,還顯示該行以後的n行
  • -C 除了顯示匹配的內容以外,還顯示改行先後的n行

2、平常使用

1.bash命令操做快捷鍵

  • ctrl-w 刪除你鍵入的最後一個單詞
  • ctrl-u 能夠刪除行內光標所在位置以前的內容
  • alt-b 和 alt-f 能夠以單詞爲單位移動光標
  • ctrl-a 能夠將光標移至行首
  • ctrl-e 能夠將光標移至行尾
  • ctrl-k 能夠刪除光標至行尾的全部內容
  • ctrl-l 能夠清屏

2.歷史記錄

鍵入 history 查看命令行歷史記錄

  • !n(n 是命令編號)就能夠再次執行
  • !$ 它用於指代上次鍵入的參數
  • !! 能夠指代上次鍵入的命令
  • alt-. 循環地移向前顯示歷史記錄
  • ctrl+r進行歷史命令搜索,重複按會向下繼續匹配 ,按入enter會執行當前匹配的歷史命令

3.目錄操做

  • cd 進行目錄切換工做
  • cd ~ 進行家目錄
  • cd - 返回前一個工做目錄
  • cd .. 返回上一個工做目錄

4.xargs命令

5.查看進程監聽的端口

使用 netstat -lntpss -plat檢查哪些進程在監聽端口(默認是檢查 TCP 端口; 添加參數 -u 則檢查 UDP 端口)
或者 lsof -iTCP -sTCP:LISTEN -P -nweb

netstst部分參數正則表達式

  • -t (tcp) 僅顯示tcp相關選項
  • -u (udp) 僅顯示udp相關選項
  • -n 拒絕顯示別名,能顯示數字的所有轉化爲數字
  • -l 僅列出在Listen(監聽)的服務狀態
  • -p 顯示創建相關連接的程序名

查看結果以下:shell

# netstst -lntp | grep 32200
tcp        0      0 0.0.0.0:32200           0.0.0.0:*               LISTEN      492/sshd

6.查看開啓的套接字和文件

lsof(list open files)是一個列出當前系統打開文件的工具。

lsof 輸出各列信息含義:
字段 含義
COMMAND 進程名稱
PID 進程標識符
USER 進程全部者
FD 文件描述符
TYPE 文件類型
DEVICE 指定磁盤名稱
SIZE 文件大小
NODE 索引節點(文件在磁盤的標識)
NAME 打開文件的確切名稱
部分lsof命令:
lsof -i:8080 		#查看8080端口占用
lsof abc.txt 		#顯示開啓文件abc.txt的進程
lsof -c abc 		#顯示abc進程如今打開的文件
lsof -c -p 1234 	#列出進程號爲1234的進程所打開的文件
lsof -g gid 		#顯示歸屬gid的進程狀況
lsof +d /usr/local/ #顯示目錄下被進程開啓的文件
lsof +D /usr/local/ #同上,可是會搜索目錄下的目錄,時間較長
lsof -d 4 			#顯示使用fd爲4的進程
lsof -i -U 			#顯示全部打開的端口和UNIX domain文件

7.能夠把別名、shell 選項和經常使用函數保存在 ~/.bashrc,這樣作的話你就能夠在全部 shell 會話中使用你的設定,把環境變量的設定以及登錄時要執行的命令保存在 ~/.bash_profile。而對於從圖形界面啓動的 shell 和 cron 啓動的 shell,則須要單獨配置文件。

8.在 Bash 腳本中,子 shell(使用括號 (...))是一種組織參數的便捷方式。一個常見的例子是臨時地移動工做路徑,代碼以下:

# do something in current dir
 (cd /some/other/dir && other-command)
 # continue in original dir

9.使用括號擴展({...})來減小輸入類似文本,並自動化文本組合。這在某些狀況下會頗有用

mv foo.{txt,pdf} some-dir 	#同時移動兩個文件 
cp somefile{,.bak} 			 #會被擴展成 cp somefile somefile.bak#
mkdir -p test-{a,b,c}/subtest-{1,2,3}	#會被擴展成全部可能的組合,並建立一個目錄樹

10.使用 man ascii 查看具備十六進制和十進制值的ASCII表。man unicode,man utf-8,以及 man latin1 瞭解通用的編碼信息。

11.將 web 服務器上當前目錄下全部的文件(以及子目錄)暴露給你所處網絡的全部用戶

python -m SimpleHTTPServer 7777 (使用端口 7777 和 Python 2)
python -m http.server 7777 (使用端口 7777 和 Python 3)

3、文件以及數據處理

1.文件查找

在當前路徑下查找 find . -name '*something*'
在全部路徑下經過文件名查找文件,使用locate something
`緩存

2.使用 sort 和 uniq,uniq 的 -u 參數和 -d 參數

sort命令用於將文本文件內容加以排序。

- -b 忽略每行前面開始出的空格字符。
- -c 檢查文件是否已經按照順序排序。
- -d 排序時,處理英文字母、數字及空格字符外,忽略其餘的字符。
- -f 排序時,將小寫字母視爲大寫字母。
- -i 排序時,除了040至176之間的ASCII字符外,忽略其餘的字符。
- -m 將幾個排序好的文件進行合併。
- -M 將前面3個字母依照月份的縮寫進行排序。
- -n 依照數值的大小排序。
- -u 意味着是惟一的(unique),輸出的結果是去完重了的。
- -o<輸出文件> 將排序後的結果存入指定的文件。
- -r 以相反的順序來排序。
- -t<分隔字符> 指定排序時所用的欄位分隔字符。
- +<起始欄位>-<結束欄位> 以指定的欄位來排序,範圍由起始欄位到結束欄位的前一欄位。
- --help 顯示幫助。
- --version 顯示版本信息。

uniq 命令用於檢查及刪除文本文件中重複出現的行列,通常與 sort 命令結合使用。

- -c或--count 在每列旁邊顯示該行重複出現的次數。
- -d或--repeated 僅顯示重複出現的行列。
- -f<欄位>或--skip-fields=<欄位> 忽略比較指定的欄位。
- -s<字符位置>或--skip-chars=<字符位置> 忽略比較指定的字符。
- -u或--unique 僅顯示出一次的行列。
- -w<字符位置>或--check-chars=<字符位置> 指定要比較的字符。
- --help 顯示幫助。
- --version 顯示版本信息。
- [輸入文件] 指定已排序好的文本文件。若是不指定此項,則從標準讀取數據;
- [輸出文件] 指定輸出的文件。若是不指定此選項,則將內容顯示到標準輸出設備(顯示終端)

當重複的行並不相鄰時,uniq 命令是不起做用的,因此uniq命令每每和sort命令一塊兒使用

3.使用 cut,paste 和 join 來更改文件

4.運用 wc 去計算新行數(-l),字符數(-m),單詞數(-w)以及字節數(-c)

wc命令用於計算字數,利用wc指令咱們能夠計算文件的Byte數、字數、或是列數,參數含義以下:

  • -c或--bytes或--chars 只顯示Bytes數。
  • -l或--lines 只顯示行數。
  • -w或--words 只顯示字數,單詞數。
  • --help 在線幫助。
  • --version 顯示版本信息

5.使用 tee 將標準輸入複製到文件甚至標準輸出,例如 ls -al | tee file.txt

tee命令用於讀取標準輸入的數據,並將其內容輸出成文件

6.使用 awk 和 sed 來進行簡單的數據處理

AWK是一種處理文本文件的語言,是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤其強大。簡單來講awk就是把文件逐行的讀入,以空格爲默認分隔符將每行切片,切開的部分再進行各類分析處理。

基本操做語法

awk -F ':' {pattern + action}' {filenames}
其中 pattern 表示 AWK 在數據中查找的內容,而 action 是在找到匹配內容時所執行的一系列命令,-F 指定劃分的分隔符,默認是空格

awk 內置變量
變量 含義
ARGC 命令行參數個數
ARGV 命令行參數排列
ENVIRON 支持隊列中系統環境變量的使用
FILENAME awk瀏覽的文件名
FNR 瀏覽文件的記錄數
FS 設置輸入域分隔符,等價於命令行 -F選項
NF 瀏覽記錄的域的個數,列數
NR 已讀的記錄數,行數
OFS 輸出域分隔符
ORS 輸出記錄分隔符
RS 控制記錄分隔符

變量$0表示整條記錄,$1表示當前行的第一個域 $2表示當前行的第二個域 一次類推
cat /etc/passwd | awk -F ':' '{print $1}' #顯示分割後的第一列

sed 命令利用腳原本處理文本文件

語法

sed [-hnV][-e<script>][-f<script文件>][文本文件]
參數說明:
-e 以選項中指定的script來處理輸入的文本文件。
-f 以選項中指定的script文件來處理輸入的文本文件。
-h或--help 顯示幫助。
-n或--quiet或--silent 僅顯示script處理後的結果。
-V或--version 顯示版本信息。

動做說明:
a :新增, a 的後面能夠接字串,而這些字串會在新的一行出現(目前的下一行)
c :取代, c 的後面能夠接字串,這些字串能夠取代 n1,n2 之間的行
d :刪除,由於是刪除啊,因此 d 後面一般不接任何咚咚
i :插入, i 的後面能夠接字串,而這些字串會在新的一行出現(目前的上一行)
p :打印,亦即將某個選擇的數據印出。一般 p 會與參數 sed -n 一塊兒運行
s :取代,能夠直接進行取代的工做哩!一般這個 s 的動做能夠搭配正規表示法

7.使用 repren 來批量重命名文件,或是在多個文件中搜索替換內容。(有些時候 rename 命令也能夠批量重命名,但要注意,它在不一樣 Linux 發行版中的功能並不徹底同樣。)

# 將文件、目錄和內容所有重命名 foo -> bar:
repren --full --preserve-case --from foo --to bar .
# 還原全部備份文件 whatever.bak -> whatever:
repren --renames --from '(.*)\.bak' --to '\1' *.bak
# 用 rename 實現上述功能(若可用):
 rename 's/\.bak$//' *.bak

8.shuf 能夠以行爲單位來打亂文件的內容或從一個文件中隨機選取多行

9.對於二進制文件,使用 hd,hexdump 或者 xxd 使其以十六進制顯示,使用 bvi,hexedit 或者 biew 來進行二進制編輯。

10.拆分文件可使用 split(按大小拆分)和 csplit(按模式拆分)

11.使用 getfacl 和 setfacl 以保存和恢復文件權限。

例如:
getfacl -R /some/path > permissions.txt
setfacl --restore=permissions.txt

4、系統調試

1.獲取 CPU 和硬盤的使用狀態,一般使用使用 top(htop 更佳),iostat 和 iotop。而 iostat -mxz 15 可讓你獲悉 CPU 和每一個硬盤分區的基本信息和性能表現。

2.若要了解內存狀態,運行並理解 free 和 vmstat 的輸出。值得留意的是「cached」的值,它指的是 Linux 內核用來做爲文件緩存的內存大小,而與空閒內存無關。

3.查看你當前使用的系統,使用 uname,uname -a(Unix/kernel 信息)或者 lsb_release -a(Linux 發行版信息)。

4.若是你刪除了一個文件,但經過 du 發現沒有釋放預期的磁盤空間,請檢查文件是否被進程佔用: lsof | grep deleted | grep "filename-of-my-big-file"

5、單行腳本

1.當你須要對文本文件作集合交、並、差運算時,sort 和 uniq 會是你的好幫手。此處假設 a 與 b 是兩內容不一樣的文件。這種方式效率很高,而且在小文件和上 G 的文件上都能運用(注意儘管在 /tmp 在一個小的根分區上時你可能須要 -T 參數,可是實際上 sort 並不被內存大小約束),參閱前文中關於 LC_ALL 和 sort 的 -u 參數的部分。

sort a b | uniq > c   # c 是 a 並 b
sort a b | uniq -d > c   # c 是 a 交 b
sort a b b | uniq -u > c   # c 是 a - b

2.使用 grep . (每行都會附上文件名)或者 head -100 (每一個文件有一個標題)來閱讀檢查目錄下全部文件的內容。這在檢查一個充滿配置文件的目錄(如 /sys、/proc、/etc)時特別好用

$ ls hosts out.txt| head -100 *

==> hosts <==
192.168.15.1
192.168.15.1
awdd
my name is mike hello
i am a teacher
what a stupid gay,fuck!

==> out.txt <==
out.txt
hosts

3.要持續監測文件改動,可使用 watch,例如檢查某個文件夾中文件的改變,能夠用 watch -d -n 2 'ls -rtlh | tail';或者在排查 WiFi 設置故障時要監測網絡設置的更改,能夠用 watch -d -n 2 ifconfig。

4.若是你想在文件樹上查看大小/日期,這可能看起來像遞歸版的 ls -l 但比 ls -lR 更易於理解:

find . -type f -ls

5.計算文本文件第三列中全部數的和(可能比同等做用的 Python 代碼快三倍且代碼量少三倍)

awk '{ x += $3 } END { print x }' myfile

相關文章
相關標籤/搜索