# Linux 常用指令
###### tags: `RD1`
:::spoiler 目錄
[TOC]
:::
## grep
* 搜尋關鍵字
:::success
```grep``` 這個指令名稱其實是來自於正規表示法的 ```g/RE/p```,其意義是代表以正規表示法全域搜尋並列印出來(globally search for RE and print it)。
:::
```shell
# 在 /etc/os-release 檔案中搜尋 Ubuntu 關鍵字
grep Ubuntu /etc/os-release
NAME="Ubuntu"
PRETTY_NAME="Ubuntu 18.04.3 LTS"
------------------------------------------
# 在 /etc/*.conf 中搜尋 network 關鍵字
grep network /etc/*.conf
ltrace.conf:hex(uint) inet_network(string);
nsswitch.conf:networks: files
sysctl.conf:# Additional settings - these settings can improve the network
sysctl.conf:# security of the host and prevent against some network attacks
sysctl.conf:# redirection. Some network environments, however, require that these
------------------------------------------
# 篩選含有 network 關鍵字的檔案名稱
ls /etc/ | grep network
network
networkd-dispatcher
networks
```
* 不分大小寫
```shell
# 不分大小寫
grep -i Ubuntu /etc/os-release
-----------------------------------------
# 標示行號
grep -n Ubuntu /etc/os-release
1:NAME="Ubuntu"
5:PRETTY_NAME="Ubuntu 18.04.3 LTS"
```
* 反向匹配
```shell
# 顯示不包含 Ubuntu 關鍵字的行
grep -v Ubuntu /etc/os-release
```
* 遞迴搜尋檔案(找資料夾裡面所有的檔案)
```shell
# 在 /etc/ 下所有檔案中搜尋 ubuntu
grep -r ubuntu /etc/
-----------------------------------------
# 在所有 *.conf 中尋找 ubuntu
grep -r --include="*.conf" ubuntu /etc/
-----------------------------------------
# 不顯示錯誤訊息
grep -r ubuntu /etc/ 2>/dev/null
```
* 顯示前後幾行
```shell
# 多顯示後一行
grep -A 1 Ubuntu /etc/os-release
# 多顯示前一行
grep -B 1 Ubuntu /etc/os-release
# 多顯示前後各一行
grep -C 1 Ubuntu /etc/os-release
```
* 顏色標示
```shell
grep --color=always 檔名
```
* 正規表示法
```shell
# a 開頭
ls | grep "^a"
# b 結尾
ls | grep "b$"
# a 或 b 開頭
ls | grep "^[ab]"
# a 或 b 結尾
ls | grep "[ab]$"
-----------------------------------------
# a 開頭,接著 b 出現零次以上
ls | grep "^ab*"
# a 開頭,接著 b 出現零次或一次
ls | grep "^ab?"
# a 開頭,接著 b 出現一次以上
ls | grep "^ab+"
-----------------------------------------
# 含有 ab 或 cd
ls | grep "ab|cd"
# 含有 ab 或 cd(另一種寫法,作用相同)
ls | grep -E "ab|cd"
-----------------------------------------
# 含有 net 這個單字
ls | grep "<net>"
issue.net
```
## awk
```shell
awk '條件類型1{動作1} 條件類型2{動作2} ...' filename
```
awk 可以處理後續接的檔案,也可以讀取來自前個指令的 standard output 。awk 主要是處理『每一行的欄位內的資料』,而預設的『欄位的分隔符號為 "空白鍵" 或 "[tab]鍵" 』
### 例一
```shell
brave_chen@CY0015923-BRAVE-CHEN cat transportation.txt
A001 腳踏車 AEADDDEE9931
A002 機車 FDEAEDFJK3394
A003 火車 FJDKE3AK34940
A004 超機車 FFJJEEE99300
A005 飛機 AIRP33333900
A006 坦克 TANK00000001
```
```shell
brave_chen@CY0015923-BRAVE-CHEN awk '{print $2","$3}' transportation.txt
腳踏車,AEADDDEE9931
機車,FDEAEDFJK3394
火車,FJDKE3AK34940
超機車,FFJJEEE99300
飛機,AIRP33333900
坦克,TANK00000001
```
由以上的例子可以知道每一行的每個欄位都是有變數名稱的,那就是 $1, $2... 等變數名稱。以上面的例子來說,A001,A002...就是$1,第一欄的意思,至於AEADDDEE9931,FDEAEDFJK3394...就是$3,第三欄的意思,其他的就依此類推。另外$0 代表『一整列資料』的意思。
|變數名稱|代表意義 |
|------|----------------------------|
| NF |每一行 ($0) 擁有的欄位總數 |
| NR |目前 awk 所處理的是『第幾行』資料|
| FS |目前的分隔字元,預設是空白鍵 |
### 例二
```shell
brave_chen@CY0015923-BRAVE-CHEN awk '{print $1 "\t lines: " NR "\t columns: " NF}' transportation.txt
A001 lines: 1 columns: 3
A002 lines: 2 columns: 3
A003 lines: 3 columns: 3
A004 lines: 4 columns: 3
A005 lines: 5 columns: 3
A006 lines: 6 columns: 3
```
### 例三
```shell
brave_chen@CY0015923-BRAVE-CHEN cat transportation.txt
A001,腳踏車,AEADDDEE9931
A002,機車,FDEAEDFJK3394
A003,火車,FJDKE3AK34940
A004,超機車,FFJJEEE99300
A005,飛機,AIRP33333900
A006,坦克,TANK00000001
```
```shell
brave_chen@CY0015923-BRAVE-CHEN awk '{FS=","} {print $1" "$3}' transportation.txt
A001,腳踏車,AEADDDEE9931
A002 FDEAEDFJK3394
A003 FJDKE3AK34940
A004 FFJJEEE99300
A005 AIRP33333900
A006 TANK00000001
```
有趣吧!不過,怎麼第一行沒有正確的顯示出來呢?這是因為我們讀入第一行的時候,那些變數 $1, $2... 預設還是以空白鍵為分隔的,所以雖然我們定義了 FS=":" 了, 但是卻僅能在第二行後才開始生效。那麼怎麼辦呢?我們可以預先設定 awk 的變數啊! 利用 BEGIN 這個關鍵字喔!這樣做:
```shell
brave_chen@CY0015923-BRAVE-CHEN awk 'BEGIN{FS=","} {print $1" "$3}' transportation.txt
A001 AEADDDEE9931
A002 FDEAEDFJK3394
A003 FJDKE3AK34940
A004 FFJJEEE99300
A005 AIRP33333900
A006 TANK00000001
```
## sed
sed (stream editor) 可以分析 Standard Input (STDIN) 的資料,
進行取代、刪除、新增、擷取特定行等處理後,再輸出到 standrad out (STDOUT)
不會對檔案本身進行修改~~只是輸出給你看~~
* sed [-nefr] [動作]
```
-n :silent模式。在 sed 的用法中,所有來自 STDIN 的資料一般都會被列出到 螢幕上。
但如果加上 -n 參數後,則只有經過 sed 特殊處理的那一行(或者動作)才會被列出來。
-e :直接在指令列模式上進行 sed 的動作編輯;
-f :-f filename 可以執行 filename 內的 sed 動作;
-r :sed 的動作支援的是延伸型正規表示法的語法。(預設是基礎正規表示法語法)
-i :直接修改讀取的檔案內容,而不是由螢幕輸出。
```
* `[n1[,n2]]function`
* n1, n2 :選擇進行動作的行數,例如『10,20[動作行為] 』
```
a :新增, a 的後面可以接字串,這些字串會在目前的下一行出現。
c :取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行。
d :刪除, d 後面通常不接任何字串;
i :插入, i 的後面可以接字串,這些字串會在目前的上一行出現;
p :列印,將某個選擇的資料印出。通常 p 會與參數 sed -n 一起運作。
s :取代, s 的動作可以搭配正規表示法。例如 1,20s/old/new/g 。
```
* 指令形式
```php
sed -n 's/item/Items/p' test.txt //取代所有item並且只印出被修改的行
```
上述指令中的界定符`/`可以被代換成任意符號如`:` `|`
## chmod

## chown
變更檔案及目錄擁有者與群組
[鳥哥](http://linux.vbird.org/linux_basic/0210filepermission.php)
在 Linux 系統上的檔案與目錄都有擁有者以及群組的屬性質,我們可以透過 ls 的輸出來查看每個檔案與目錄的擁有者與群組:
```shell
ls -l
```

```ls -l ```的輸出中,第三欄與第四欄就是檔案或目錄的擁有者與群組名稱,例如這裡的 ```log``` 目錄其擁有者就是 ```bill_chiu```,群組就是 ```admin```
```
# 將 test 的擁有者改為 root
sudo chown root test.txt
```
這樣就可以將 ```test.txt``` 這個檔案的擁有者改為 ```root```。

如果要更改檔案或目錄的群組,也可以用 ```chown``` 更改:
```
#將 myfile 的群組改為 root
sudo chown :root test.txt
```
chown 的第一個參數若以冒號開頭,就是代表群組名稱的意思,這一行指令就是將 test.txt 這個檔案的群組改為 root。
:::info
不過,請記得,要被改變的群組名稱必須要在/etc/group檔案內存在才行,否則就會顯示錯誤!
:::

```shell
#將 myfile 的群組改為 everyone
sudo chown :everyone test.txt
```

若要同時更改 test.txt 的擁有者與群組,可以這樣寫:
```shell
# 同時更改擁有者與群組
sudo chown 666:owner test.txt
```

## ls
功能:**列出所在或指定目錄的內容or檔案之相關特性**
語法:ls [-選項] [目錄or檔案名稱]
常用選項及其代表之意義
-a : 列出所有檔案名稱,包括以『.』開頭之隱藏檔,如.profile、.login等。
-d : 若參數的為一目錄名稱,則只列出檔案名稱而非目錄之內容。
-l : 列出檔案的詳細資料,包括檔案形態、存取權限、連結數目、擁有 者名稱、群組名稱等。
## pwd
**印出目前工作目錄之絕對路徑**
```
/Applications/MAMP/htdocs/here
```
## ps
> [linux命令:ps](http://linux.kutx.cn/linux/4/31133.html)
**這是察看執行中的程式的一個指令,您可以搭配kill指令隨時中斷,刪除不必要的程序**:
```shell
ps [options]
```
- -a顯示所有終端機下執行的程序,除了階段作業領導者之外。
- a顯示現行終端機下的所有程序,包括其他用戶的程序。
- -A顯示所有程序。
- -c顯示CLS和PRI欄位。
- c列出程序時,顯示每個程序真正的指令名稱,而不包含路徑,參數或常駐服務的標示。
- -C<指令名稱>指定執行指令的名稱,並列出該指令的程序的狀況。
- -d顯示所有程序,但不包括階段作業領導者的程序。
- -e此參數的效果和指定"A"參數相同。
- e列出程序時,顯示每個程序所使用的環境變量。
- -f顯示UID,PPIP,C與STIME欄位。
- f用ASCII字符顯示樹狀結構,表達程序間的相互關係。
- -g<群組名稱>此參數的效果和指定"-G"參數相同,當亦能使用階段作業領導者的名稱來指定。
- g顯示現行終端機下的所有程序,包括群組領導者的程序。
- -G<群組識別碼>列出屬於該群組的程序的狀況,也可使用群組名稱來指定。
- h不顯示標題列。
- -H顯示樹狀結構,表示程序間的相互關係。
- -j或j採用工作控制的格式顯示程序狀況。
- -l或l採用詳細的格式來顯示程序狀況。
- L列出欄位的相關信息。
- -m或m顯示所有的執行緒。
- n以數字來表示USER和WCHAN欄位。
- -N顯示所有的程序,除了執行ps指令終端機下的程序之外。
- -p<程序識別碼>指定程序識別碼,並列出該程序的狀況。
- p<程序識別碼>此參數的效果和指定"-p"參數相同,只在列表格式方面稍有差異。
- r只列出現行終端機正在執行中的程序。
- -s<階段作業> 指定階段作業的程序識別碼,並列出隸屬該階段作業的程序的狀況。
- s採用程序信號的格式顯示程序狀況。
- S列出程序時,包括已中斷的子程序資料。
- -t<終端機編號>指定終端機編號,並列出屬於該終端機的程序的狀況。
- t<終端機編號>此參數的效果和指定"-t"參數相同,只在列表格式方面稍有差異。
- -T顯示現行終端機下的所有程序。
- -u<用戶識別碼>此參數的效果和指定"-U"參數相同。
- u以用戶為主的格式來顯示程序狀況。
- -U<用戶識別碼>列出屬於該用戶的程序的狀況,也可使用用戶名稱來指定。
- U<用戶名稱>列出屬於該用戶的程序的狀況。
- v採用虛擬內存的格式顯示程序狀況。
- -V或V顯示版本信息。
- -w或w採用寬闊的格式來顯示程序狀況。
- x顯示所有程序,不以終端機來區分。
- X採用舊式的Linux i386登陸格式顯示程序狀況。
- -y配合參數"-l"使用時,不顯示F(flag)欄位,並以RSS欄位取代ADDR欄位。
- -<程序識別碼>此參數的效果和指定"p"參數相同。
- -\-cols<每列字符數>設置每列的最大字符數。
- -\-columns<每列字符數>此參數的效果和指定"--cols"參數相同。
- -cumulative此參數的效果和指定"S" 參數相同。
- -\-deselect此參數的效果和指定"-N"參數相同。
- -\-forest此參數的效果和指定"f"參數相同。
- -\-headers重複顯示標題列。
- -\-help在線幫助。
- -\-info顯示排錯信息。
- -\-lines<顯示列數>設置顯示畫面的列數。
- -\-no-headers此參數的效果和指定"h"參數相同,只在列表格式方面稍有差異。
- -\-group<群組名稱>此參數的效果和指定"-G"參數相同。
- -\-Group<群組識別碼>此參數的效果和指定"-G"參數相同。
- -\-pid<程序識別碼>此參數的效果和指定"-p"參數相同。
- -\-rows<顯示列數>此參數的效果和指定"--lines"參數相同。
- -\-sid<階段作業>此參數的效果和指定"-s"參數相同。
- -\-tty<終端機編號>此參數的效果和指定"-t"參數相同。
- -\-user<用戶名稱>此參數的效果和指定"-U"參數相同。
- -\-User<用戶識別碼>此參數的效果和指定"-U"參數相同。
- -\-version此參數的效果和指定"-V"參數相同。
- -\-widty<每列字符數>此參數的效果和指定"-cols"參數相同。
## wget
**下載**
```shell
wegt 網址(http,ftp)
```
常用選項/替代指令
```shell
cat urls.txt | xargs wget
```
## curl
**功能更多的wget**
```shell
curl -O 網址
```
## tail
**顯示尾幾行**
```shell
tail [-n]
```
n:指定行數,預設為10行
## head
**顯示頭幾行**
```shell
head [-n]
```
n:指定行數,預設為10行
## cat
**印出檔案內容至銀幕(標準輸出)或合併多檔**
cat file1 file2 > file3 可將檔案file1、file2之內容依順序合併,並將結果存至file3。
```shell
cat [-選項] file
```
可當more使用(讀黨)
## less
**上下翻頁看內容**
```shell
less file
man ps | less
```
近入後案 / 搜尋
n 跳到下一筆匹配
N 回島上一筆匹配
## rsync
> [Linux 使用 rsync 遠端檔案同步與備份工具教學與範例](https://blog.gtwang.org/linux/rsync-local-remote-file-synchronization-commands//)
`rsync` 的角色就像是一般 Linux 的 `cp` 與 `scp` 指令,可以將檔案或目錄從來源位置複製到目的位置,不過 `rsync` 在複製檔案時會比 `cp` 與 `scp` 更有效率,並且支援連結檔與設備檔(devices),也可以保留檔案的擁有者、群組與權限設定
`rsync` 在第一次複製檔案時,會複製完整的檔案內容,而之後再次複製檔案時,就會先以 delta transfer 演算法檢查新舊檔案之間的差異,只傳送有變動的部份,可加快備份速度,尤其是在累進備份大檔案時,效果更明顯。另外 `rsync` 在使用網路傳送資料時,也支援資料的自動壓縮與解壓縮,這樣可以有效減少耗費的網路頻寬。
基本語法
```shell
rsync 參數 來源檔案 目的檔案
```
以下是最常見的幾個參數:
- `-v`:verbose 模式,輸出比較詳細的訊息。
- `-r`:遞迴(recursive)備份所有子目錄下的目錄與檔案。
- `-a`:封裝備份模式,相當於 `-rlptgoD`,遞迴備份所有子目錄下的目錄與檔案,保留連結檔、檔案的擁有者、群組、權限以及時間戳記。
- `-z`:啟用壓縮。
- `-h`:將數字以比較容易閱讀的格式輸出
## telnet
這套軟體在 Windows 及 Linux 系統中都存在,只是介面有點不很相同就是了。
基本上,**這個程式是 user 端用來連線登入遠端主機的**。
例如人在台南,但是可以在台南使用可以連上 Internet 的電腦,經由 telnet 連線上家裡的 Linux 主機,而進行設定。
感覺上就好像在家裡玩自己的 Linux 主機一樣。
一般來說,如果你是使用 Winodows 系統,則你可以在『開始』-->『執行』後,輸入 telnet xxx.yyy.zzz.qqq ,其中, xxx.yyy.zzz.qqq 為 IP 位址,則可以連上主機(或者是 BBS )囉。當然,如果您是在 Linux 系統下,亦可直接輸入 telnet xxx.yyy.zzz.qqq 來連上主機或BBS。
```shell
telnet 主機位址(或主機名稱)
```
## nc
這個 nc 指令可以用來作為某些服務的檢測,因為他可以連接到某個 port 來進行溝通,此外,還可以自行啟動一個 port 來傾聽其他用戶的連線。
```
nc [-u] [IP|host] [port]
nc -l [IP|host] [port]
選項與參數:
-l :作為監聽之用,亦即開啟一個 port 來監聽用戶的連線;
-u :不使用 TCP 而是使用 UDP 作為連線的封包狀態
```
## ping
**檢測連線**
```shell
ping [ci] 位址
```
c:次數
i:間格
## nslookup
**這是用來查詢或反查詢 DNS 的指令**
例如我們要知道 雅虎 的網路位址,則可以如此查詢:
```shell
$ nslookup tw.yahoo.com
Server: 192.168.151.31
Address: 192.168.151.31#53
Non-authoritative answer:
tw.yahoo.com canonical name = atsv2-fp-shed.wg1.b.yahoo.com.
Name: atsv2-fp-shed.wg1.b.yahoo.com
Address: 180.222.102.201
Name: atsv2-fp-shed.wg1.b.yahoo.com
Address: 180.222.102.202
```
系統會告訴你,我們使用的 DNS server 是 ksdns.seed.net.tw,而查詢到的網址是 180.222.102.202。
## netstat
**這也是用來觀察網路狀況的指令**
```shell
netstat
```
## ssh
> [遠端連線伺服器SSH / XDMCP / VNC / RDP](http://linux.vbird.org/linux_server/0310telnetssh.php)
## ifconfig
> [Linux 常用網路指令](http://linux.vbird.org/linux_server/0140networkcommand.php)
**查詢、設定網路卡與 IP 網域等相關參數**
```shell
ifconfig [選項]
```
- up 開啟該網路介面
- down 關閉該網路介面
- mtu N 設定最大傳輸單位為 N
- netmask 設定子網路遮罩
- broadcast 設定廣播位置
一般來說,直接輸入 ifconfig 就會列出目前已經被啟動的卡,不論這個卡是否有給予 IP,都會被顯示出來。而如果是輸入 ifconfig eth0,則僅會秀出這張介面的相關資料, 而不管該介面是否有啟動。
所以如果你想要知道某張網路卡的 Hardware Address,直接輸入『 ifconfig "網路介面代號" 』即可,至於出現的各項資料是這樣的(資料排列由上而下、由左而右):
- eth0:就是網路卡的代號,也有 lo 這個 loopback ;
- HWaddr:就是網路卡的硬體位址,俗稱的 MAC 是也;
- inet addr:IPv4 的 IP 位址,後續的 Bcast, Mask 分別代表的是 Broadcast 與 netmask 喔!
- inet6 addr:是 IPv6 的版本的 IP ,我們沒有使用,所以略過;
- MTU:就是第二章談到的 MTU 啊!
- RX:那一行代表的是網路由啟動到目前為止的封包接收情況, packets 代表封包數、errors 代表封包發生錯誤的數量、 dropped 代表封包由於有問題而遭丟棄的數量等等
- TX:與 RX 相反,為網路由啟動到目前為止的傳送情況;
- collisions:代表封包碰撞的情況,如果發生太多次, 表示你的網路狀況不太好;
- txqueuelen:代表用來傳輸資料的緩衝區的儲存長度;
- RX bytes, TX bytes:總接收、傳送的位元組總量
## find
**依照指定條件,找尋檔案或目錄**
```
find start_directory [-選項]
```
-name 指定範本樣式的檔名
-iname 搜尋可以忽略大小寫之分
-path 指定目錄的範本
-user 指定使用者名稱
-group 群組名指定群組名稱
-amin < min> 指定時間內曾被存取過的檔案,單位為分鐘
-atime < day> 指定時間內曾被存取過的檔案,單位為24小時
-exec <指令> 當找到符合條件的檔案,就執行該指令,指令結尾必須是";"
-mmin < min> 指定時間內曾異動過的檔案,單位為分鐘
-mtime < day> 指定時間內曾被異動過的檔案,單位為24小時
-nouser 檔案不屬於本機上之任何User的檔案
-ok <指令> 用法同-exec,唯每一個指令執行前均會詢問使用者
-print 將符合條件的檔案資料由終端機顯示出來
-size <檔案大小> 符合檔案大小的檔案,單位為512Byte(Block),檔案大小前加"+"號代表大於這個 size,"-"代表小於這個size
Example:
```shell
find ./ -size +500 -print
```
###找到目前目錄下,檔案大小大於250K Bytes的檔案,並將結果由終端機輸出
```shell
find / -nouser -exec rm {} \;
```
###找出整個系統中所有"無主檔案"並刪除之。
## which
**搜尋命令執行檔的完整路徑**
利用 which 選項 命令 可以依據「PATH環境變數」的內容來搜索命令執行檔,並顯示該命令之命令執行檔的完整路徑(若該命令執行檔不在PATH中,則不會被搜尋到)。其中,選項可以是:
- 無選項:若不輸入選項,則系統只顯示第一個被找到的命令執行檔之完整路徑。
- -a:系統會顯示所有被找到的命令執行檔之完整路徑。
```shell
$ which ls
/bin/ls。
$ which -a ifconfig
/sbin/ifconfig
$ which -a echo
/bin/echo
```
## watch
>[[Linux] 使用watch 定期執行指令](https://caloskao.org/linux-watch-use-watch-to-execute-a-command-periodically/) & [每天一個linux命令(48):watch命令](https://www.cnblogs.com/peida/archive/2012/12/31/2840241.html)
watch 是 [procps](https://gitlab.com/procps-ng/procps) 套件內的其中一個指令,基本上現在多數的 Linux 發行版預設的系統套件就包含了 procps。如果系統預設並沒有安裝的話,可以利用套件管理工具安裝,或是到 procps 的 [GitLab](https://gitlab.com/procps-ng/procps) 下載原始碼編譯安裝。
在 mac OS 下可輸入 `brew install watch` 進行安裝。
**可以將命令的輸出結果輸出到標準輸出設備,多用於週期性執行命令/定時執行命令**
```
watch[参数][命令]
```
-n或--interval watch缺省每2秒運行一下程序,可以用-n或-interval來指定間隔的時間。
-d或--differences用-d或--differences選項watch會高亮顯示變化的區域。
而-d=cumulative選項會把變動過的地方(不管最近的那次有沒有變動)都高亮顯示出來。
-t或-no-title會關閉watch命令在頂部的時間間隔,命令,當前時間的輸出。
-h, --help 查看幫助文檔
## kill
這是用來殺掉執行中程式的指令,需配合 `ps` 這個指令,當你執行一個 ftp 程式,但是他有點當當的時候,你可以 `ps -aux` 這個指令查出 ftp 這個程式的代碼(PID),假設其 PID 為 110 ,然後輸入:
```
kill 110
```
即可殺掉這個 ftp 程式。
## du(Disk usage)
**這是用來察看目錄內所有檔案使用掉的空間的情況**,如下所示:
```
du -m
```
其中, du 預設的檔案輸出資料為 KB,以參數 -m 使檔案資料顯示為 MB。
```
du [-hscd]
du -hc *.jpg
```
h: human-readable
s: summary (僅列目錄總容量知結果)
c: 當前目錄下(檔案)的傯總容量
dN:指定深度
## df(Disk free)
**這是用來察看硬碟空間的指令。**
由於我們目前將檔案都建立在根目錄『/』下,所以只要沒有空間,則所有檔案都無法複製進來系統。不過,若你規劃出多的硬碟,則可以察看你的硬碟空間資訊,如下所示:
```
df [-ahT]
```
a: 顯示所有系統檔案,包括大小為零的系統檔案
h: human-readable
T: 印出檔案系統類型($ mount-1)
## lsof
在 Linux 系統之下,幾乎所有的系統資源都是以檔案的形式呈現的(包含一般檔案、目錄、連結檔、裝置檔、管線檔、網路 socket 等),所以對於管理者來說,若要查詢一個程式使用了哪些系統資源,就可以透過它開啟的檔案來得知。
lsof 指令可以用來查詢行程所開啟的檔案列表,這個小工具對於系統管理者來說非常實用,而且也非常重要,以下是這個工具的使用方式與範例。
```
# 列出所有行程所開啟的檔案
lsof
# 不過由於輸出的資料量太大了,通常我們不太會這樣使用。
```
### 查詢開啟指定檔案的行程
如果想要查詢目前正在開啟指定檔案的行程,可以在執行 lsof 時直接加上檔案的名稱與路徑。
```
# 列出所有開啟檔案的行程
lsof <filename>
```
### 列出指定使用者所開啟的檔案
```
# 列出 terry 使用者所開啟的檔案
lsof -u terry
```
### 列出指定程式所開啟的檔案
```
# 列出 httpd 伺服器所開啟的檔案
lsof -c httpd
```
### 條件查詢( OR 與 AND )
```
# 多個條件(OR 運算)
lsof -u root -c java
# 多個條件(AND 運算)
lsof -a -u root -c java
```
### 排除條件
```
# 列出非 root 使用者所開啟的檔案
lsof -u ^root
```
### 根據 PID 列出所開啟的檔案
```
# 列出 PID 為 14662 的行程,所開啟的檔案
lsof -p 14662
# 根據多個 PID 列出開啟的檔案
lsof -p 14662,14678,14979
```
### 網路連線
```
# 列出所有網路連線
lsof -i
# 列出所有 TCP 網路連線
lsof -i tcp
# 列出所有 UDP 網路連線
lsof -i udp
# 列出 80 連接埠的網路連線
lsof -i :80
# 列出 SMTP 的網路連線
lsof -i :smtp
# 列出 3642 連接埠的 TCP 連線
lsof -i tcp:3642
# 列出 1 到 1024 連接埠的 TCP 網路連線
lsof -i :1-1024
# 列出所有處於 LISTEN 狀態的 TCP 網路連線
lsof -i TCP -s TCP:LISTEN
# 列出已建立的 TCP 網路連線
lsof -i TCP -s TCP:ESTABLISHED
```
## 參考資料
[Linux 基本指令介紹 - for Red Hat Linux 6.1](https://linux.vbird.org/linux_basic/redhat6.1/linux_06command.php)
[Linux - 常用指令彙整](https://www.eebreakdown.com/2016/08/linux.html#sec-7)
[Linux常用指令](http://nmc.nchu.edu.tw/tanet/linuxcommand.htm)
[ Linux 常用網路指令](http://linux.vbird.org/linux_server/0140networkcommand.php)