[TOC]
# Linux系統命令介紹
Linux默認安裝后有上千個系統命令之多,包含了常用命令和管理員命令,但最常用的不超過20個命令,以下整理了最常用的系統命令和案例。除以下20個命令外我們還可以通過“man”命令,即幫助手冊來查詢其它的命令使用方法和案例。
## ls 查看命令
ls(list directory contents) 顯示文件及文件目錄 ls--(list) , ls命令的常用參數:
* -a 常用參數和意義
* -l 顯示目錄下所有文件包括隱藏文件
```
[djangowang@localhost ~]# ls -al
total 188
drwxr-x--- 14 root root 4096 Oct 25 21:53 .
drwxr-xr-x 25 root root 4096 Nov 10 21:04 ..
-rw------- 1 root root 1069 Oct 25 21:41 anaconda-ks.cfg
-rw------- 1 root root 31 Oct 25 21:46 .bash_history
-rw-r--r-- 1 root root 24 Jan 6 2007 .bash_logout
```
每一列的含義
| 列 | 含義 | 案例 |
| --- | --- |--- |
| 第一列 | 文件權限和屬性 | drwxr-x--- |
| 第二列 | 硬鏈接(hard link)。對于新建的目錄,其硬鏈接計數為2,分別是.和.. | 數值 |
| 第三列 | 文件所屬用戶 | root |
| 第四列 | 文件所屬組 | root |
| 第五列 | 文件大小(單位字節) | 4096(4k) |
| 第六列 | 文件最后修改時間 | Oct 25 21:41 |
| 第七列 | 文件名 | anaconda-ks.cfg |
*注:文件是存儲在硬盤上的,硬盤的最小存儲單位叫做扇區,每個扇區存儲512字節。操作系統讀取硬盤的時候,不會一個個扇區地讀取,而是一次性連續讀取多個扇區,即一次性讀取一個“塊”。這種由多個扇區組成的塊,是文件存取的最小單位。塊的大小,最常見的是4KB,即連續八個扇區組成一個“塊”。文件數據存儲在塊中,那么還必須找到一個地方存儲文件的元信息,比如文件的創建者、文件的創建日期、文件的大小等等,這種存儲文件元信息的區域就叫做inode。每個inode節點中都有一個鏈接計數器,只有鏈接計數為零時才會刪除,這就是為什么,”解除一對文件鏈接“并不意味著釋放改文件塊的原因。*
## cd 命令
用戶目錄的切換。 cd命令的常用參數:
* (-)回到剛剛去的目錄
* 返回宿主目錄
* 去上一級目錄
```
[djangowang@localhost ~]# cd /etc # 進入/etc目錄
[djangowang@localhost ~]# cd ~ # 返回宿主目錄
```
## mkdir命令
mkdir(make directories)創建目錄結構。mkdir命令的常用參數:
* -p 遞歸創建目錄
```
[djangowang@localhost ~]# mkdir test
[djangowang@localhost ~]# ls
test
[djangowang@localhost ~]# mkdir -p .a/b/c/d
[djangowang@localhost ~]# tree
.
`-- a
`-- b
`-- c
`-- d
```
*注:tree命令是一個獨立的系統命令,我們可以通過“yum install tree”來安裝它。*
## pwd 命令
pwd(print name of current/working directory)查看路徑。
```
[djangowang@localhost ~]# pwd
/root
```
## mv 命令
mv( move or rename files) 移動 & 改名命令 。 mv命令的常用參數:
* -i 覆蓋前先詢問用戶
* \-b :若需覆蓋文件,則覆蓋前先行備份。
```
[djangowang@localhost ~]# mv test test1
[djangowang@localhost ~]# ls
test1
```
移動目錄,(mv filename target )。
```
[djangowang@localhost ~]# mv test1 /etc
```
## find 命令
find(find - search for files in a directory hierarchy)查找命令,find命令的常用參數:
* find -name # 查找文件名
* find -type # 查找文件類型 (f 文件、d 目錄、c 字符設備、l鏈接、s socket)
* find -exec # 執行系統命令
* find -mtime # 創建文件的時間
```
[djangwang@localhost ~]# find . -name "*.conf" # 查找當前目錄下,以conf結尾文件
./pam_smb.conf
./java/java.conf
./nsswitch.conf
./gconf/2/evoldap.conf
./alsa/alsa.conf
./alsa/pcm/side.conf
./alsa/pcm/front.conf
...
```
查找20天前的日志并刪除。
```
[djangwang@localhost ~]# find /var/log -type f -mtime +20 | xargs rm -f
```
將/etc目錄下的*.conf文件,備份到/tmp目錄下一份。
```
[djangwang@localhost ~]# find /etc/ -type f -name "*.conf" -exec cp {} /tmp/ \;
```
如果要放在Crontab中定時運行,推薦更嚴禁的書寫方式。
```
[djangwang@localhost ~]# [ -d /var/logs ] && find /var/log -type f -mtime +20 | xargs rm -f
```
其中“[ -d /var/logs ] ” 判斷目錄是否存在,如果存在再執行find命令,防止目錄不存在find命令從根目錄開始刪除。
## cp 命令
cp(copy files and directories) 復制命令,cp命令的常用參數:
* -R # 復制目錄
```
[djangowang@localhost ~]# cp -R ./test ./test1
[djangowang@localhost ~]# ls
test1 test
```
## cat 命令
cat(concatenate files and print on the standard output)顯示文件內容命令,cat命令的常用參數:
* -A # 顯示特殊字符
* -n # 顯示行號
```
[djangowang@localhost ~]# cat -n /etc/passwd
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
...
```
## wc 命令
wc(print newline, word, and byte counts for each file) 統計命令,wc命令的常用參數:
* -l # 顯示多少行
* -w # 顯示多少單詞
* -c # 顯示字數
```
[djangowang@localhost ~]# wc -l /etc/passswd
[djangowang@localhost ~]# 35
```
## sort命令
sort(sort lines of text files)排序命令,sort命令的常用參數:
* -n # 數學形式排序(默認按首字母的ASCII排序)
* -r # 倒序排列
```
[djangowang@localhost ~]# for i in `seq 1 10`;do echo $i >> sort.txt ;done # 寫入測試數據
[djangowang@localhost ~]# sort -r sort.txt
```
sort命令通常與uniq命令連用。 以下是統計Nginx日志每日訪問的獨立IP的次數。
* \-c或--count # 在每列旁邊顯示該行重復出現的次數
```
[djangowang@localhost ~]# cat access.log | awk '{print $1}' | sort -n | uniq -c
206 49.234.146.32
238 63.143.42.246
575 193.112.218.224
....
```
## grep 命令
grep (print lines matching a pattern)在文中查找命令,grep命令的常用參數:
* -l "查找內容" # 顯示要查找內容的文件名
* -n "查找內容" # 顯示行號
* -數字 "查找內容" # 顯示查找內容的上下行內容
```
[djangowang@localhost ~]# grep "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
...
```
## 正則表達式
正則表達式(regular expression)描述了一種字符串匹配的模式(pattern),可以用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串等。使用grep命令會經常用到正則匹配,譬如匹配ifconfig命令輸出IP地址。關于grep命令的正則匹配常用參數:
* -E # 它會以擴展的正則表達式的模式來解釋模式
* -o # 只顯示正則顯示的內容
```
[djangowang@localhost ~]# ifconfig | grep -Eo "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
172.17.0.1
255.255.0.0
0.0.0.0
172.16.16.2
255.255.240.0
172.16.31.255
127.0.0.1
255.0.0.0
```
正則表達式。
| 限定符 | 描述 |
| --- | --- |
| . | 匹配任意的一個字符。 |
| ? | 匹配前面的子表達式,最多一次。 |
| \* | 匹配前面的子表達式零次或多次。 |
| + | 匹配前面的子表達式一次或多次。 |
| {N} | 匹配前面的子表達式 N 次。 |
| {N,} | 匹配前面的子表達式 N 次到多次。 |
| {N,M} | 匹配前面的子表達式 N 到 M 次,至少 N 次至多 M 次。 |
| \- | 只要不是在序列開始、結尾或者序列的結束點上,表示序列范圍。 |
| ^ | 匹配一行開始的空字符串;也表示字符不在要匹配的列表中。 |
| $ | 匹配一行末尾的空字符串。 |
| \\b | 匹配一個單詞前后的空字符串。 |
| \\B | 匹配一個單詞中間的空字符串。 |
| \\< | 匹配單詞前面的空字符串。 |
| \\> | 匹配單詞后面的空字符串。 |
## cut 命令
cut (remove sections from each line of files)切割命令,cut命令的常用參數:
* -d "分隔符" # 查找文件內容
* -f "列名" # 常與-d參數連用,用些分列顯示列名
* -c "數字" # 顯示截取后的內容
```
[djangowang@localhost ~]# cut -d : -f1 /etc/passwd
root
bin
daemon
...
```
## du命令
du ( estimate file space usage) 查看系統文件或目錄大小。du命令的常用參數:
* -s # \--summarize ,顯示匯總統計信息
* -h # 以 K,M,G 為單位,提高信息的可讀性
```
[djangowang@localhost ~]# du -sh *
12K bakup
5.5M exa
1.9M get-pip.py
```
## rm命令
rm (remove files or directories) 刪除文件或目錄。它還有一個相同的命令就是rmdir(remove empty directories)用于刪除空目錄,但我們一般用rm命令可以完全替代它。命令的常用參數:
* -r # 遞歸刪除,可以刪除文件夾下所有文件
* -f # 強制刪除
* -i # 刪除前確認
```
[djangowang@localhost ~]# rm -rf /data1/tmp/*
```
*注:rm屬于高危操作,需要謹慎。與Windows不同Linux下并沒有回收站,所以刪除任何文件前最好先將它移動到一個空目錄,類似Windows回收,待過一段時間再統一清理這個目錄的內容。關于Linux為什么沒有回收站——這句話摘錄自“Unix編程藝術”,Unix面向更加專業的用戶 ,Unix的開發者喜歡清晰、簡單的操作,用戶告訴做什么就做什么,即便用戶使用的命令等價于“向我開槍”的命令。而這樣做Unix的開發本能辯解的就是:保護用戶避免自我損害,應該是GUI或應用程序級別的事,而非操作系統*
## touch 命令
touch (touch - change file timestamps) 用于創建文本文件或修改文件的時間。
```
[djangowang@localhost ~]# touch test
[djangowang@localhost ~]# ls
test
```
## 查看文件內容命令
more (more - file perusal filter for crt viewing) 適用于查看文件內容比較多的場景。
```
[djangowang@qlocalhost ~]# more /etc/passwd
```
less (less - opposite of more)用于查看文件不多,需要瀏覽的場景。
```
[djangowang@qlocalhost ~]# less /etc/passwd
```
tail (tail - output the last part of files)用于查看文件內容行位,且文件會不斷的追加的場景。
* -f # 動態查看文件追加的內容
* -n # 可以查看文件末尾多少行
```
[djangowang@qlocalhost ~]# tail -f /var/log/messages
[djangowang@qlocalhost ~]# tail -n 20 /var/log/messages
```
head(head - output the first part of files) 查看文件頭部的內容。
* -n # 可以查看文件頭部的多少行
```
[djangowang@qlocalhost ~]# head -n 20 /var/log/messages
```
## man
man ( an interface to the on-line reference manuals) 幫助手冊
```
[djangowang@localhost ~]# man ls
```
# 命令自動補全
Linux系統命令比較多,部分命令比較長且難記,這里我們只要對他有一個模糊記憶,譬如只記錄他以什么字母開頭,并通過Linux系統快捷鍵(tab)自動補全功能,來逐步篩選你模糊記憶中的命令。
# 本章小結
本章從Linux常用的基礎命令開始講起,根據筆者的工作經歷整理了最常用的命令和參數,并根據從簡單到負責的順序來介紹它。Linux命令有1000多個,每個命令有平均有5個左右參數,所以要記憶的知識點大概有5000多,我們不可能完全記憶它們,這時就需要幫助手冊協助我們來查詢這些命令的使用方法。Linux命令部分命令比較長不太容易記憶,Linux還提供了命令自動補全的快捷鍵來協助我們更好的掌握它們。下一章我們將會介紹常用的編輯器vim,為后續修改系統配置文件時作為鋪墊。
# 習題
1.查找 /etc/passwd 文件中包含root的行,并顯示第一行內容。
2.在根目錄下創建 /data1/webroot/nginx 的目錄結構。
3.如果通過grep命令查找出的關鍵字,并高亮顯示關鍵字。
4. 查看文件的命令都有哪些,它們有什么區別?