文件系統與文件管理
知識簡介
概念
- linux的文件系統可以理解爲:由文件和目錄組成的樹結構。文件系統的最頂層是由根目錄開始的,系統使用“/”來表示根目錄,在根目錄之下的既可以是目錄,也可以是文件,而每一個目錄中又可以包含(子)目錄或文件。如此反覆就可以構成一個龐大的文件系統。
- 在Linux系統的文件系統中,有兩個特殊的目錄,一個是用戶所在的工作目錄,即當前目錄,用“ . ”表示;另一個是當前目錄的上級目錄,用“ . . ”表示。(若一個目錄或文件名是以“點”開始,則表示這個目錄或文件是一個隱藏目錄或文件;以默認方式査找時(ls 命令),不會顯示該目錄或文件)
文件的命名與分類
文件系統命名規則
- Linux下文件命名長度不超過255個字節
- Linux下以不同顏色區分文件類型:
紅色>>>壓縮文件
綠色>>>可執行文件
藍色>>>目錄文件
示例:
灰色>>>其他文件
淡藍色>>>鏈接文件
- Linux下文件命名區分大小寫,如,file!=File
Linux系統下文件類型
Linux下除通過顏色辨別文件類型外還可通過命令“ll”(小寫字母L)來查看文件類型。
以“-”開頭爲普通文件;
以“l”開頭爲鏈接文件;
以“d”開頭爲目錄文件;
以“c”開頭爲字符設備;
以“p”開頭爲管道文件。
Linux系統中的重要目錄文件
- 在Linux系統有一些十分重要的目錄,這些目錄用來存放用戶自己的文件以及一些常用的可執行文件以及系統配置等。
目錄名 | 功能 |
---|---|
/etc | 配置文件目錄 |
/dev | 設備文件及特殊文件存儲位置 |
/boot | 引導文件存放目錄,內核文件(vmlinuz)、引導加載器(bootloader, grub)都存放於此目錄 |
/tmp | 臨時文件存儲位置 |
/usr | 存放系統的應用程序和與命令相關的數據 |
/var | 包括系統運行時要改變的數據。其中包括每個系統是特定的,即不能夠與其他計算機共享的目錄 |
/proc | 用於輸出內核與進程信息相關的虛擬文件系統 |
/bin | 幾乎所有用戶命令.有些命令在/bin 或/usr/local/bin 中. |
目錄切換及其管理
- 在Linux系統中需要頻繁切換目錄來查看目錄下的內容,但是需要怎樣確認自己所處目錄以及怎樣切換目的目錄呢。這就需要用到pwd命令,cd命令以及ls命令。
pwd 命令(Print Working Directory)
——顯示用戶當前所處的工作目錄
命令格式 | 功能 |
---|---|
pwd -P | 顯示物理路徑,不包括鏈接 |
pwd -L | 顯示當前正在工作中的路徑 |
示例:
cd 命令(Change Directory)
—— 用來切換工作目錄
命令格式 | 功能 |
---|---|
cd ~ | 切換到home目錄下 |
cd . . | 切換到上一級目錄 |
cd /home/user | 切換到home文件夾下的user目錄下 |
ls 命令(list)
——最常見的目錄操作命令,其主要功能是顯示當前目錄下的內容
命令格式 | 功能 |
---|---|
ls -a | 顯示所有文件(包括隱藏文件) |
ls -S | 按由大到小的順序顯示 |
ls -X | 按文件擴展名順序顯示 |
ls * | 顯示顯示所有文件以及子目錄下的內容 |
示例:
文件的創建,複製,移動,查看和刪除
- 在操作Linux系統時少不了對文件的增加刪除和修改,接下來讓我們瞭解一下文件的具體操作。
touch命令
—— 創建新文件
命令格式 | 功能 |
---|---|
-a | 只修改文件的訪問時間 |
-c | 僅修改文件的時間參數(3 個時間參數都改變),如果文件不存在,則不建立新文件 |
-d | 後面可以跟欲修訂的日期,而不用當前的日期,即把文件的 atime 和 mtime 時間改爲指定的時間 |
-m | 只修改文件的數據修改時間 |
-t | 命令後面可以跟欲修訂的時間,而不用目前的時間 |
mkdir命令
—— 創建文件夾
命令格式 | 功能 |
---|---|
-m | 選項用於手動配置所創建目錄的權限,而不再使用默認權限 |
-p | 選項遞歸創建所有目錄 |
cp命令
——用於複製目錄和文件
命令格式 | 功能 |
---|---|
-a | 相當於 -d、-p、-r 選項的集合,這幾個選項我們一一介紹 |
-d | 如果源文件爲軟鏈接(對硬鏈接無效),則複製出的目標文件也爲軟鏈接 |
-l | 把目標文件建立爲源文件的硬鏈接文件,而不是複製源文件 |
-s | 把目標文件建立爲源文件的軟鏈接文件,而不是複製源文件 |
-p | 複製後目標文件保留源文件的屬性(包括所有者、所屬組、權限和時間) |
-r | 遞歸複製,用於複製目錄 |
-u | 若目標文件比源文件有差異,則使用該選項可以更新目標文件,此選項可用於對文件的升級和備用 |
示例:
mv命令
—— 移動文件和重命名
命令格式 | 功能 |
---|---|
-f | 強制覆蓋,如果目標文件已經存在,則不詢問,直接強制覆蓋 |
-i | 交互移動,如果目標文件已經存在,則詢問用戶是否覆蓋 |
-n | 如果目標文件已經存在,則不會覆蓋移動,而且不詢問用戶 |
-v | 顯示文件或目錄的移動過程 |
-u | 若目標文件已經存在,但兩者相比,源文件更新,則會對目標文件進行升級 |
示例:
rm命令
——刪除文件
命令格式 | 功能 |
---|---|
-f | 強制刪除(force),和 -i 選項相反,使用 -f,系統將不再詢問,而是直接刪除目標文件或目錄 |
-i | 和 -f 正好相反,在刪除文件或目錄之前,系統會給出提示信息,使用 -i 可以有效防止不小心刪除有用的文件或目錄 |
– | – |
-r | 遞歸刪除,主要用於刪除目錄,可刪除指定目錄及包含的所有內容,包括所有的子目錄和文件 |
示例:
文件的權限管理
知識簡介
Linux系統根據用戶對文件的權限將系統中的所有用戶分爲:所有者,同組用戶,其他用戶三類;併爲這三類用戶分別設定所需的文件操作權限。
——用戶分類:
- “ u ”:——文件擁有者
- “ g ”:——文件屬組(文件歸屬的羣組)
- “ o ”:——其他用戶
注:當用戶輸入“ l l ”或者“ ls -l”命令查看文件信息時,可以看到如下信息:drwxrwxr-x
;字符串左數第一位(d)表示文件類型,除去第一位後的左三位表示擁有者的權限(rwx),中三位表示屬組成員的權限,後三位表示其他用戶的權限
——權限分類:
- “ r ”:——讀取權限
- “ w ”:——寫入權限
- “ x ”:——執行權限
- “ - ”:——空權限
圖示:
權限管理
我們可以使用“ chmod ”命令來對文件的各項權限進行修改。如:“chmod u+x 文件名 ”(也可以用二進制法代替“ u+x ")即可完成對擁有者用戶執行權限的增加。 還可以使用“ chgrp ”命令來更換文件的屬組。如:“ chgrp -R 新屬組 文件名“即可完成屬組更改。
注:二進制法即利用二進制形式表示權限,” 777 “即表示” rwxrwxrwx ",“ 421 ”即表示“ r—w---x ”
針對文件的普通權限可以用chmod命令更改,實例如下:
- 首先利用” chmod u+x file1 “命令爲文件擁有者添加一個對文件file1的執行權限;然後輸入” chmod 0664 file1 “命令用二進制法刪除文件擁有者對文件file1的執行權限。
liuyan@liuyan-virtual-machine:~/Desktop/Text/practice$ ls
file1 file2 file3
liuyan@liuyan-virtual-machine:~/Desktop/Text/practice$ ll -d file1
-rw-rw-r-- 1 liuyan liuyan 0 2月 28 18:22 file1
liuyan@liuyan-virtual-machine:~/Desktop/Text/practice$ sudo chmod u+x file1
liuyan@liuyan-virtual-machine:~/Desktop/Text/practice$ ll -d file1
-rwxrw-r-- 1 liuyan liuyan 0 2月 28 18:22 file1*
liuyan@liuyan-virtual-machine:~/Desktop/Text/practice$ sudo chmod 0664 file1
liuyan@liuyan-virtual-machine:~/Desktop/Text/practice$ ll -d file1
-rw-rw-r-- 1 liuyan liuyan 0 2月 28 18:22 file1
liuyan@liuyan-virtual-machine:~/Desktop/Text/practice$
利用umask命令更改新建文件或目錄的默認權限,實例如下:
注:普通用戶umask的值爲0002,root用戶umask的值爲0022,可通過” umask -p 新umask值“更改umask的值。
liuyan@liuyan-virtual-machine:~/Desktop/Text/practice$ umask
0002
liuyan@liuyan-virtual-machine:~/Desktop/Text/practice$ umask -p 0022
liuyan@liuyan-virtual-machine:~/Desktop/Text/practice$ umask
0022
liuyan@liuyan-virtual-machine:~/Desktop/Text/practice$
注:新建文件的權限爲666-umask(即rw-rw-r–),新建目錄的權限爲777-umask(即rwxrwxr-x)
Linux文件系統上的特殊權限
——— 爲了更方便,高效以及安全的控制文件,而引入了的一組權限。
權限名稱 | 作用 | 詳解 |
---|---|---|
suid | 作用二進制文件所屬者的身份運行 | suid借用文件擁有者(u)權限中的最後一位(x),並用s來表示;當文件擁有者具有執行權限(x)時且該文件擁有特殊權限suid,則用小寫字母s來表示即rws,若無執行權限則用大寫字母S表示 |
sgid | 作用目錄新建文件集成父母的屬組 | sgid借用文件羣組權限(g)中的最後一位(x),並用s來表示(原理同上) |
sticky | 作用目錄此目錄下誰創建僅創建者能刪除 | sticky借用文件其他用戶(o)權限中的最後一位(x),並用t來表示(原理同上) |
Linux下的訪問控制權限
爲了實現靈活的權限管理,除了文件的所有者,所屬組和其它人,可以對更多的用戶設置權;故利用可以用setfacl和getfacl命令爲多用戶或者組的文件和目錄賦予訪問權限。(設定 ACl 權限,常用命令有 2 個,分別是 setfacl 和 getfacl 命令,前者用於給指定文件或目錄設定 ACL 權限,後者用於查看是否配置成功)
getfacl 命令: 用於查看文件或目錄當前設定的 ACL 權限信息。基本格式爲——getfacl 文件名
setfacl 命令: 用於直接設定用戶或羣組對指定文件的訪問權限
格式 | 功能 |
---|---|
-m | 設定 ACL 權限 |
-x | 刪除指定用戶或羣組的 ACL 權限 |
-b | 刪除所有的 ACL 權限 |
-d | 設定默認 ACL 權限,只對目錄生效,指目錄中新建立的文件擁有此默認權限 |
-R | 遞歸設定 ACL 權限,指設定的 ACL 權限會對目錄下的所有子文件生效 |
-k | 刪除默認 ACL 權限 |
用戶及其權限管理
在Linux系統上,每個用戶都會有一個在內部與之對應的ID號碼;羣組也一樣,每個羣組也有一個與之對應ID號碼;這些ID號碼存儲在硬盤上。
- Linux用戶可以分爲;管理用戶,系統用戶,普通用戶以及登錄用戶。
- 羣組可以分爲主要組和附加組,一個用戶有且只有一個主組。
- 用戶和羣組的主要配置文件如下:
文件目錄 | 功能 | 內容描述 |
---|---|---|
/etc/passwd | 主要存儲用戶的屬性和信息,即信息數據庫 | 用戶信息【用戶】【密碼x表示加密】【-u 用戶id】【-g 用戶組id】【-c 用戶描述信息】【-d 用戶家目錄】【-s 用戶shell解釋器】 |
/etc/shadow | 主要存儲用戶密碼及其屬性,即密碼數據庫 | 用戶密碼信息,用來記錄密碼策略,【用戶名】【密碼】【1970年到上一次修改密碼時間】【/etc/login.defs 密碼多少天內不能修改密碼,0表示隨時可修改】【/etc/login.defs 密碼有效期是多少天,99999表示密碼永不更改】【/etc/login.defs 密碼到期前7天通知信息】【useradd/mod -f 參數,密碼寬限期】【useradd/mod -e 參數 用戶失效時間】【保留】 |
/etc/group | 主要存儲羣組的屬性和信息,即羣組數據庫 | 組信息 【組信息】【組密碼】【-g 組id】【-G 所屬附加組用戶】 |
/etc/gshadow* | 主要存儲羣組密碼及其屬性,即羣組密碼數據庫 | 組密碼信息,【用戶組信息】【用戶組密碼】【組管理員列表】【組員信息】 |
用戶的增刪查改
用戶增加
——useradd命令
格式 | 功能 |
---|---|
-d | 指定用戶的主目錄 |
-u | 手工指定用戶的 UID |
-g | 指定用戶的初始組 |
-p | 指定新帳戶的加密密碼(需要加密後的) |
-G | 指定用戶的附加組 |
-s | 指定用戶的登錄 Shell |
-m | 建立用戶時強制建立用戶的家目錄 |
-M | 不創建主目錄不創建用戶的主目錄 |
-h | 幫助顯示此幫助消息並退出 |
示例:
root@liuyan-virtual-machine:/home# useradd -m aaa
用戶刪除
——userdel命令
示例:
root@liuyan-virtual-machine:~# userdel -rf bbb
用戶修改
——usernod命令
格式 | 功能 |
---|---|
-c | 修改用戶的說明信息 |
-e | 修改用戶的失效曰期 |
-d | 修改用戶的主目錄 |
-s | 修改用戶的登錄 Shell |
-l | 修改用戶名稱 |
-g | 修改用戶的初始組 |
-u | 修改用戶的UID |
-G | 修改用戶的附加組 |
示例:
root@liuyan-virtual-machine:~# usermod -l bbb aaa
用戶查詢
id命令
格式 | 功能 |
---|---|
-Z | 只打印進程的安全上下文 |
-g | 打印有效的組ID |
-G | 打印所有組ID |
-u | 打印有效的用戶ID |
示例:
root@liuyan-virtual-machine:~# id -u liuyan
羣組的增刪查改
羣組增加
——groupadd命令
格式 | 功能 |
---|---|
-f | 如果組已存在,則強制退出成功,如果GID已經被使用,則取消-g |
-g | 將gid用於新組 |
-h | 幫助顯示此幫助消息並退出 |
-r | 創建系統羣組 |
示例:
root@liuyan-virtual-machine:~# groupadd aaa
羣組刪除
——groupdel命令
格式 | 功能 |
---|---|
-f | 強制刪除 |
-h | 查看幫助文檔 |
示例:
root@liuyan-virtual-machine:~# groupdel aaa
羣組成員查詢
——groupmems命令
格式 | 功能 |
---|---|
-g | 更改groupname而不是用戶的組 |
模塊 | 功能 |
– | – |
-a | 向組成員添加用戶名 |
-d | 從組成員中刪除用戶名 |
-h | 顯示此幫助消息並退出 |
-p | 清除組中的所有成員 |
-l | 列出組的成員 |
示例:
root@liuyan-virtual-machine:~# groupmems -g aaa -a liuyan
羣組修改
——groupmod命令
格式 | 功能 |
---|---|
g | 修改組 ID |
-n | 修改組名 |
示例:
root@liuyan-virtual-machine:~# groupmod aaa bbb
綜合示例:
在某目錄下創建的新文件自動屬於g1組,組g2的成員如:alice能對這些新文件有讀寫權限,組g3的成員如:tom只能對新文件有讀權限,其它用戶(不屬於g1,g2,g3)不能訪問這個文件夾。
- 首先利用groupadd命令創建g1,g2組;創建用戶tom,alice並把他們加入到相應的組裏同時設置密碼。然後進入到目標目錄利用getfacl命令查看相關信息。再利用“setfacl -Rm group:g1:rw- 目標文件"命令設置權限。
root@liuyan-virtual-machine:/dev/TTT# groupadd g1
root@liuyan-virtual-machine:/dev/TTT# groupadd g2
root@liuyan-virtual-machine:/dev/TTT# useradd -G g1 -m alice
root@liuyan-virtual-machine:/dev/TTT# useradd -G g2 -m tom
root@liuyan-virtual-machine:/dev/TTT# passwd alice
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
root@liuyan-virtual-machine:/dev/TTT# passwd tom
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
root@liuyan-virtual-machine:/dev/TTT# mkdir ooo
root@liuyan-virtual-machine:/dev/TTT#chmod g+s ./ooo
root@liuyan-virtual-machine:/dev/TTT# ls
ooo
root@liuyan-virtual-machine:/dev/TTT# getfacl ooo
# file: ooo
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
root@liuyan-virtual-machine:/dev/TTT# setfacl -Rm group:g1:rw- ./ooo
root@liuyan-virtual-machine:/dev/TTT# getfacl ooo
# file: ooo
# owner: root
# group: root
user::rwx
group::r-x
group:g1:rw-
mask::rwx
other::r-x
- 這時,切換到alice用戶,測試權限。
alice@liuyan-virtual-machine:~$ cd /dev/TTT
alice@liuyan-virtual-machine:/dev/TTT$ ls
ooo
alice@liuyan-virtual-machine:/dev/TTT$ cd ooo
-su: cd: ooo: Permission denied
alice@liuyan-virtual-machine:/dev/TTT$
- 由於未分配該用戶執行權限,導致無法訪問該文件目錄,需要再次利用setfacl命令添加執行權限。(注意該權限不可被繼承)
root@liuyan-virtual-machine:/dev/TTT# setfacl -m group:g1:rwx ./ooo
- 再次登入alice用戶,查看權限是否只正確,同時利用getfacl命令查看相關信息。
alice@liuyan-virtual-machine:/dev/TTT$ cd ooo
alice@liuyan-virtual-machine:/dev/TTT/ooo$ touch file1
alice@liuyan-virtual-machine:/dev/TTT/ooo$ ls
file1
alice@liuyan-virtual-machine:/dev/TTT/ooo$ getfacl file1
# file: file1
# owner: alice
# group: alice
user::rw-
group::rw-
group:g1:rw-
mask::rw-
other::r--
alice@liuyan-virtual-machine:/dev/TTT/ooo$
- 現在現需要更改tom用戶的權限原理同上。
root@liuyan-virtual-machine:/dev/TTT# setfacl -Rm user:tom:r-- ./ooo
- 切換tom用戶查看權限是否有誤。
alice@liuyan-virtual-machine:/dev/TTT/ooo$ su - tom
Password:
tom@liuyan-virtual-machine:~$ cd /dev/TTT/
tom@liuyan-virtual-machine:/dev/TTT$ ls
ooo
tom@liuyan-virtual-machine:/dev/TTT$ getfacl ./ooo/
# file: ooo/
# owner: root
# group: root
user::rwx
user:tom:r--
group::r-x
group:g1:rwx
mask::rwx
other::r-x
- 同樣爲tom用戶添加執行權限。(不可被繼承)
root@liuyan-virtual-machine:/dev/TTT# setfacl -m user:tom:r-x ./ooo
- 最後檢查各用戶的權限信息。
om@liuyan-virtual-machine:/dev/TTT$ cd ooo/
tom@liuyan-virtual-machine:/dev/TTT/ooo$ ls
file1
tom@liuyan-virtual-machine:/dev/TTT/ooo$ touch file2
touch: cannot touch 'file2': Permission denied
文本管理
在Linux系統中同樣需要針對文本的操作,下面主要介紹文本的相關操作。
文本查看
cat 命令
—— 查看文件裏的文本內容
格式 | 功能 |
---|---|
-A | 顯示所有等信息 |
-b | 數字非空數字非空輸出行 |
-e | 等價於-vE |
-E | 每行末尾顯示$ |
-n | 所有輸出行的編號 |
-s | 壓縮空白抑制重複的空輸出行 |
-t | 相當於-vT |
-T | 顯示選項卡將選項卡字符顯示爲^I |
-v | 顯示非打印使用^和M-符號,除了LFD和TAB |
示例:
liuyan@liuyan-virtual-machine:~$ cat -A 1.txt
對於較長的文本,需要用cat命令配合其他命令來使用,如:more,less,head,tail等命令
more命令
more功能類似 cat ,more命令從前向後讀取文件, more會以一頁一頁的顯示方便使用者逐頁閱讀,按空白鍵(space)就往下一頁顯示,按 b 鍵就會往回(back)一頁顯示,而且還有搜尋字串的功能 。
格式 | 功能 |
---|---|
-num | 一次顯示的行數 |
-d | 提示使用者,在畫面下方顯示 [Press space to continue, ‘q’ to quit.] ,如果使用者按錯鍵,則會顯示 [Press ‘h’ for instructions.] 而不是 ‘嗶’ 聲 |
-l | 取消遇見特殊字元 ^L時會暫停的功能 |
-f | 計算行數時,以實際上的行數,而非自動換行過後的行數(有些單行字數太長的會被擴展爲兩行或兩行以上) |
-p | 不以捲動的方式顯示每一頁,而是先清除螢幕後再顯示內容 |
-c | 跟 -p 相似,不同的是先顯示內容再清除其他舊資料 |
-s | 當遇到有連續兩行以上的空白行,就代換爲一行的空白行 |
-u | 不顯示下引號 (根據環境變數 TERM 指定的 terminal 而有所不同) |
示例:
liuyan@liuyan-virtual-machine:/dev$ ls |more
less命令
less 命令也是對文件或其它輸出進行分頁顯示的工具。less 的用法比起 more 更加的具有優勢。使用 less 時,可以使用 pageup],pagedown]等按鍵來往前往後翻看文件,更容易用來查看一個文件的內容
進入less命令前:
格式 | 功能 |
---|---|
-b | 設置緩衝區的大小 |
-f | 強迫打開特殊文件,例如外圍設備代號、目錄和二進制文件 |
-g | 標誌最後搜索的關鍵詞 |
-i | 忽略搜索時的大小寫 |
-m | 示類似more命令的百分比 |
-N | 顯示每行的行號 |
-o | 將less 輸出的內容在指定文件中保存起來 |
-Q | 不使用警告音 |
-s | 顯示連續空行爲一行 |
-S | 行過長時間將超出部分捨棄 |
-x | 將“tab”鍵顯示爲規定的數字空格 |
進入less命令後
按鍵 | 功能 |
---|---|
n | 重複前一個搜索(與 / 或 ? 有關) |
N | 反向重複前一個搜索(與 / 或 ? 有關) |
b | 向後翻一頁 |
d | 向後翻半頁 |
h | 顯示幫助界面 |
Q | 退出less 命令 |
u | 向前滾動半頁 |
y | 向前滾動一行 |
pagedown | 向下翻動一頁 |
pageup | 向上翻動一頁 |
示例:
liuyan@liuyan-virtual-machine:/dev$ ls |less
head命令
head命令用於顯示文件的開頭的內容。在默認情況下,head命令顯示文件的頭10行內容
格式 | 功能 |
---|---|
-c | 顯示每個文件的前K 字節內容;如果附加"-"參數,則除了每個文件的最後K字節數據外 顯示剩餘全部內容 |
-n | 顯示每個文件的前K 行內容;如果附加"-"參數,則除了每個文件的最後K行外 顯示剩餘全部內容 |
-q | 不顯示包含給定文件名的文件頭 |
-v | 總是顯示包含給定文件名的文件頭 |
示例:
liuyan@liuyan-virtual-machine:/dev$ ls |head -n 1
agpgart
tail命令
用於顯示指定文件末尾內容,不指定文件時,作爲輸入信息進行處理。常用查看日誌文件
格式 | 功能 |
---|---|
-f | 循環讀取 |
-q | 不顯示文件名 |
-v | 顯示文件名 |
-c | 顯示文件最後N字節內容 |
-n | 顯示行數 |
示例:
liuyan@liuyan-virtual-machine:/dev$ ls |tail -n 1
zfs
文本抽取
大多情況下我們更希望從某一出文本中篩選出重要內容,這就用到cut(剪切)工具
cut命令
cut命令可以從一個文本文件或者文本流中提取文本列,從而實現數據抽取
格式 | 功能 |
---|---|
-b | 僅顯示行中指定直接範圍的內容 |
-c | 僅顯示行中指定範圍的字符 |
-d | 指定字段的分隔符,默認的字段分隔符爲“TAB” |
-f | 顯示指定字段的內容 |
-n | 與“-b”選項連用,不分割多字節字符 |
示例:
liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ df -h|tr -s " "|sort -nr -t " " -k 5|grep /dev/sda1
/dev/sda1 49G 9.2G 38G 20% /
liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ df -h|tr -s " "|sort -nr -t " " -k 5|grep /dev/sda1|cut -d " " -f 5
20%
文本分析
針對某一文本內容我們可能需要對其進行排序,比較,統計其出現的次數等,從而更好的對文本內容進行分析,以便尋找裏面的信息
sort命令
sort命令可以幫我們依據不同的數據類型進行排序
格式 | 功能 |
---|---|
-b | 忽略每行前面開始出的空格字符 |
-c | 檢查文件是否已經按照順序排序 |
-f | 排序時,忽略大小寫字母 |
-M | 將前面3個字母依照月份的縮寫進行排序 |
-n | 依照數值的大小排序 |
-o | 將排序後的結果存入指定的文件 |
-r | 以相反的順序來排序 |
-t | 指定排序時所用的欄位分隔字符 |
-k | 選擇以哪個區間進行排序 |
uniq命令
使用uniq命令可以在最左側報告或忽略文件中的重複行,一般與sort 連用
格式 | 功能 |
---|---|
-c | 在每列旁邊顯示該行重複出現的次數 |
-d | 僅顯示重複出現的行列 |
-f | 忽略比較指定的欄位 |
-s | 忽略比較指定的字符 |
-u | 僅顯示出一次的行列 |
-w | 指定要比較的字符 |
-n | 前n個字段和每個字段前的空白一起被忽略 |
tr命令
tr命令可以對來自標準輸入的字符進行替換、壓縮和刪除
格式 | 功能 |
---|---|
-c | 取代所有不屬於第一字符集的字符 |
-d | 刪除所有屬於第一字符集的字符 |
-s | 把連續重複的字符以單獨一個字符表示 |
-t | 先刪除第一字符集較第二字符集多出的字符 |
綜合示例:
案例一:
找出ifconfig “網卡名”命令結果中本機的IPv4地址
1.輸入ifconfg命令查看本機IP地址,我們可以看到目標IP地址在第二行
liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.79.131 netmask 255.255.255.0 broadcast 192.168.79.255
inet6 fe80::81a:a8bd:29cd:b06c prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:1a:6b:07 txqueuelen 1000 (Ethernet)
RX packets 357 bytes 45624 (45.6 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 275 bytes 30555 (30.5 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 198 bytes 15868 (15.8 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 198 bytes 15868 (15.8 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
- 通過管道配合tr命令壓縮信息之間的空格
liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ ifconfig|tr -s " "
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.79.131 netmask 255.255.255.0 broadcast 192.168.79.255
inet6 fe80::81a:a8bd:29cd:b06c prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:1a:6b:07 txqueuelen 1000 (Ethernet)
RX packets 379 bytes 47582 (47.5 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 283 bytes 31441 (31.4 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 202 bytes 16192 (16.1 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 202 bytes 16192 (16.1 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
- 再利用sort命令按照字母對顯示信息排序,這時目標信息在第四行
liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ ifconfig|tr -s " "|sort -n -t "t" -k 3
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
ether 00:0c:29:1a:6b:07 txqueuelen 1000 (Ethernet)
inet 127.0.0.1 netmask 255.0.0.0
inet 192.168.79.131 netmask 255.255.255.0 broadcast 192.168.79.255
inet6 ::1 prefixlen 128 scopeid 0x10<host>
inet6 fe80::81a:a8bd:29cd:b06c prefixlen 64 scopeid 0x20<link>
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
loop txqueuelen 1000 (Local Loopback)
RX errors 0 dropped 0 overruns 0 frame 0
RX errors 0 dropped 0 overruns 0 frame 0
RX packets 221 bytes 17953 (17.9 KB)
RX packets 466 bytes 55914 (55.9 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
TX packets 221 bytes 17953 (17.9 KB)
TX packets 340 bytes 40387 (40.3 KB)
- 若想提取目標信息我們需要將提取範圍縮小,這時利用head命令提取出信息前四行
liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ ifconfig|tr -s " "|sort -n -t "t" -k 3|head -n 4
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
ether 00:0c:29:1a:6b:07 txqueuelen 1000 (Ethernet)
inet 127.0.0.1 netmask 255.0.0.0
inet 192.168.79.131 netmask 255.255.255.0 broadcast 192.168.79.255
- 然後通過tail命令成功提取目標信息
liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ ifconfig|tr -s " "|sort -n -t "t" -k 3|head -n 6|tail -n 1
inet 192.168.79.131 netmask 255.255.255.0 broadcast 192.168.79.255
- 這時我們需要將目標IP分離,利用cut命令將多餘信息分離即可
liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ ifconfig|tr -s " "|sort -n -t "t" -k 3|head -n 6|tail -n 1|cut -d " " -f 3
192.168.79.131
案例二:
查出/tmp的權限,以數字方式顯示
- 通過stat命令顯示文件全部信息,這時我們可以看到目標信息位於第四行(1777)
liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ stat /tmp
File: /tmp
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 801h/2049d Inode: 1966081 Links: 14
Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-02-26 15:15:09.420093913 +0800
Modify: 2020-02-29 16:37:47.031618619 +0800
Change: 2020-02-29 16:37:47.031618619 +0800
Birth: -
- 首先將顯示信息壓縮方便進一步操作
liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ stat /tmp|tr -s " "
File: /tmp
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 801h/2049d Inode: 1966081 Links: 14
Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-02-26 15:15:09.420093913 +0800
Modify: 2020-02-29 16:37:47.031618619 +0800
Change: 2020-02-29 16:37:47.031618619 +0800
Birth: -
- 進一步提取前四行信息,縮小範圍
liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ stat /tmp|tr -s " "|head -n 4
File: /tmp
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 801h/2049d Inode: 1966081 Links: 14
Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( 0/ root)
- 通過cut命令剪切目標信息做最後提取
liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ stat /tmp|tr -s " "|head -n 4|tail -n 1
Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( 0/ root)
liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ stat /tmp|tr -s " "|head -n 4|tail -n 1|cut -d "/" -f 1
Access: (1777
liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ stat /tmp|tr -s " "|head -n 4|tail -n 1|cut -d "/" -f 1|cut -d "(" -f 2
1777
文本三劍客
grep命令
很多時候,我們並不需要顯示出文件的全部內容,而是從文件中找出指定信息,這時,我們可以使用 grep 命令。
grep 命令用於查找內容包含指定模式(即正則表達式)的文件,如果發現某文件的內容符合所指定的模式樣式,預設 grep 指令會把含有模式樣式的那一列顯示出來
注:正則表達式由一類特殊的字符 或文本組成,有些字符(元字符)並不表示其字面內容,而是表示控制或通配功能。
參數格式 | 功能 |
---|---|
-e | 開啓正則表達式 |
-i | 忽略大小寫 |
-v | 反過來(invert),只打印沒有匹配的,而匹配的反而不打印 |
-n | 顯示行號 |
-w | 被匹配的文本只能是單詞,而不能是單詞中的某一部分,如文本中有liker,而我搜尋的只是like,就可以使用-w選項來避免匹配liker |
-c | 顯示總共有多少行被匹配到了,而不是顯示被匹配到的內容,注意如果同時使用-cv選項是顯示有多少行沒有被匹配到 |
-o | 只顯示被模式匹配到的字符串 |
-A # | 顯示匹配到的字符串所在的行及其後n行,after |
-B # | 顯示匹配到的字符串所在的行及其前n行,before |
-C # | 顯示匹配到的字符串所在的行及其前後各n行,context |
示例:
-n 顯示行號
liuyan@liuyan-virtual-machine:~$ cat /etc/passwd|grep -n /bin
1:root:x:0:0:root:/root:/bin/bash
3:bin:x:2:2:bin:/bin:/usr/sbin/nologin
5:sync:x:4:65534:sync:/bin:/bin/sync
12:proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
30:speech-dispatcher:x:111:29:Speech Dispatcher,,,:/var/run/speech-dispatcher:/bin/false
-c 統計匹配行數
liuyan@liuyan-virtual-machine:~$ cat /etc/passwd|grep -c /bin
10
-o 顯示匹配內容
liuyan@liuyan-virtual-machine:~$ cat /etc/passwd|grep -o /bin
/bin
/bin
/bin
正則表達式
相關簡介
正則表達式由一類特殊的字符 或文本組成,有些字符(元字符)並不表示其字面內容,而是表示控制或通配功能。
字符通配
模式 | 功能 |
---|---|
. | 匹配任意單個字符 |
[ ] | 匹配指定範圍內的任意單個字符 |
[^] | 匹配指定範圍外的任意單個字符 |
[:alnum:] | 字母和數字 |
[:alpha:] | 代表任何英文大小寫字符,亦即A-Z, a-z |
[:lower:] | 小寫字母[:upper:] 大寫字母 |
[:blank:] | 空白字符(空格和製表符) |
[:space:] | 水平和垂直的空白字符(比[:blank:]包含的範圍廣) |
[:cntrl:] | 不可打印的控制字符(退格、刪除、警鈴…) |
[:digit:] | 十進制數字[:xdigit:]十六進制數字 |
[:graph:] | 可打印的非空白字符 |
[:print:] | 可打印字符 |
[:punct:] | 標點符號 |
示例:
. 匹配任意單個字符
liuyan@liuyan-virtual-machine:~$ netstat -ant|grep -o 192.1.
192.16
192.16
192.16
[:alnum:] 字母和數字
liuyan@liuyan-virtual-machine:~$ netstat -ant|grep -o [[:alnum:]]
A
c
1
[:lower:] 小寫字母[:upper:] 大寫字母
liuyan@liuyan-virtual-machine:~$ netstat -ant|grep -o [[:lower:]]
c
t
i
[:digit:] 十進制數字[:xdigit:]十六進制數字
liuyan@liuyan-virtual-machine:~$ netstat -ant|grep -o [[:digit:]]
0
0
1
2
7
綜合示例:
liuyan@liuyan-virtual-machine:~$ netstat -ant|grep [[:lower:]][[:lower:]][[:alnum:]][[:digit:]]
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 ::1:631 :::* L
次數通配
字符 | 功能 |
---|---|
* | 匹配前面的字符任意次,包括0次(貪婪模式:儘可能長的匹配) |
.* | 任意長度的任意字符 |
? | 匹配其前面的字符0或1次 |
± | 匹配其前面的字符至少1次 |
{n} | 匹配前面的字符n次 |
{m,n} | 匹配前面的字符至少m次,至多n次 |
{,n} | 匹配前面的字符至多n次 |
{n,} | 匹配前面的字符至少n次 |
示例:
{n}-------匹配前面的字符n次
liuyan@liuyan-virtual-machine:~/Desktop/Text/practice$ cat ff
telephonenumber is 13356487956
liuyan@liuyan-virtual-machine:~/Desktop/Text/practice$ cat ff|grep -o 1[[:digit:]]\\{10\\}
18695250179
{m,n}----匹配前面的字符至少m次,至多n次
liuyan@liuyan-virtual-machine:~$ netstat -ant|grep -o [[:digit:]]\\{1\,3\\}\\.[[:digit:]]\\{1\,3\\}\\.[[:digit:]]\\{1\,3\\}\\.[[:digit:]]\\{1\,3\\}
127.0.0.53
0.0.0.0
0.0.0.0
0.0.0.0
127.0.0.1
0.0.0.0
位置錨定
字符 | 功能 |
---|---|
^ | 行首錨定,用於模式的最左側 |
$ | 行尾錨定,用於模式的最右側 |
^PATTERN$ | 用於模式匹配整行 |
^$ | 空行 |
^[[:space:]]*$ | 空白行 |
< 或\b | 詞首錨定,用於單詞模式的左側 |
> 或\b | 詞尾錨定;用於單詞模式的右側 |
<PATTERN> | 匹配整個單詞 |
示例:
^ 行首錨定,用於模式的最左側
liuyan@liuyan-virtual-machine:~/Desktop/Text/practice$ cat ff|grep 1[[:digit:]]\\{10\\}
telephonenumber is 13356487956
liuyan@liuyan-virtual-machine:~/Desktop/Text/practice$ cat ff|grep -o ^tel[[:lower:]]\\{1\,\\}
telephonenumber
$ 行尾錨定,用於模式的最右側
liuyan@liuyan-virtual-machine:~/Desktop/Text/practice$ cat ff|grep 1[[:digit:]]\\{10\\}
telephonenumber is 13356487956
liuyan@liuyan-virtual-machine:~/Desktop/Text/practice$ cat ff|grep -o [[:digit:]]\\{1\,\\}$
13356487956
綜合案例
- 顯示某目錄下某文件中以大小s開頭的行
首先輸入cat命令查看相關信息
liuyan@liuyan-virtual-machine:~$ cat /proc/meminfo
MemTotal: 4002280 kB
MemFree: 527556 kB
MemAvailable: 1396708 kB
Buffers: 68360 kB
Cached: 1044216 kB
SwapCached: 0 kB
Active: 2171800 kB
然後利用管道+grep命令過濾主要信息
liuyan@liuyan-virtual-machine:~$ cat /proc/meminfo |grep -e ^S -e ^s
SwapCached: 0 kB
SwapTotal: 2097148 kB
SwapFree: 2097148 kB
Shmem: 79768 kB
Slab:
- 顯示/etc/passwd文件中不以/bin/bash結尾的行
首先輸入cat命令查看目標信息
liuyan@liuyan-virtual-machine:~$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
然後通過管道利用grep命令過濾以/bin/bash結尾的信息
liuyan@liuyan-virtual-machine:~$ cat /etc/passwd|grep /bin/bash$
root:x:0:0:root:/root:/bin/bash
liuyan:x:1000:1000:liuyan,,,:/home/liuyan:/bin/bash
最後加入-v命令逆置過濾結果即可
liuyan@liuyan-virtual-machine:~$ cat /etc/passwd|grep -v /bin/bash$
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
- 找出/etc/passwd中的兩位或三位數
首先輸入cat命令通過管道利用grep命令過濾含有兩三位數的信息
liuyan@liuyan-virtual-machine:~$ cat /etc/passwd|grep [[:digit:]]\\{2\,3\\}
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
然後通過-o命令將數字提取即可
liuyan@liuyan-virtual-machine:~$ cat /etc/passwd|grep -o [[:digit:]]\\{2\,3\\}
655
34
60
12
10
- 顯示Ubuntu上所有系統用戶的用戶名和UID
首先輸入cat命令查看信息
liuyan@liuyan-virtual-machine:~$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
然後銅鼓管道加grep命令篩選用戶名
liuyan@liuyan-virtual-machine:~$ cat /etc/passwd|grep ^[[:lower:]]\\{1\,\\}:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
利用正則表達式篩選用戶名和Uid,最後利用-o命令提取即可
liuyan@liuyan-virtual-machine:~$ cat /etc/passwd|grep -o -e ^[[:lower:]]\\{1\,\\}: -e :[[:digit:]]\\{1\,\\}:
root:
:0:
daemon:
:1:
bin:
:2:
sys:
- 找出/etc/passwd用戶名同shell名的行
首先利用cat命令查看所屬信息,然後通過管道利用grep命令過濾出用戶名
liuyan@liuyan-virtual-machine:~$ cat /etc/passwd|grep -o -e ^[[:lower:]]\\{1\,\\}
root
daemon
bin
sys
sync
games
man
lp
然後利用正則表達式過濾出bash,再利用-o命令提取即可
liuyan@liuyan-virtual-machine:~$ cat /etc/passwd|grep -o -e ^[[:lower:]]\\{1\,\\} -e /[[:lower:]]\\{1\,\\}$
root
/bash
daemon
/nologin
bin
/nologin
sys
/nologin
最後利用tr命令壓縮空格,並賦值給數組後輸出
liuyan@liuyan-virtual-machine:~$ a=$(cat /etc/passwd|grep -o -e ^[[:lower:]]\\{1\,\\} -e /[[:lower:]]\\{1\,\\}$|tr -s " ")
liuyan@liuyan-virtual-machine:~$ echo ${a}
root /bash daemon /nologin bin /nologin sys /nologin sync /sync games /nologin man /nologin lp /nologin mail /nologin news /nologin uucp /nologin proxy /nologin
- 利用df和grep,取出磁盤各分區利用率,並從大到小排序
利用df命令查看硬件使用數據
liuyan@liuyan-virtual-machine:~$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 1.9G 0 1.9G 0% /dev
tmpfs 391M 2.0M 389M 1% /run
/dev/sda1 49G 9.3G 38G 20% /
tmpfs 2.0G 89M 1.9G 5% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
然後通過管道過濾百分比數字,再利用sort命令排序即可
liuyan@liuyan-virtual-machine:~$ df -h|grep [[:digit:]]\\{1\,3\\}%|sort -n
/dev/loop0 35M 35M 0 100% /snap/gtk-common-themes/818
/dev/loop10 92M 92M 0 100% /snap/core/8689
/dev/loop11 13M 13M 0 100% /snap/gnome-characters/139
/dev/loop1 2.3M 2.3M 0 100% /snap/gnome-calculator/260
/dev/loop12 4.3M 4.3M 0 100% /snap/gnome-calculator/544