該系列文章只是本人的學習筆記,文章中的文字描述提取自《Linux鳥哥私房菜》《Linux運維之道》等書中的重點內容,化繁為簡能夠在工作中快速復習掌握重點,並不代表個人立場,但轉載請加出處,並注明參考文獻。
了解了基本的Linux文件文件系統的概念后,我們將更深入的了解一下Linux的其他方面的內容,那就是我們所使用的用戶接口,也就是大家常聽到的 『Shell』 ,『這個shell並不是黑客反彈的shell』,而是一種Linux的命令接口,在 Linux 的世界中,默認使用的是 GNU 開發出來的 shell ,稱為 BASH Shell,簡單來說,我們之前使用的幾個命令都是 bash 管理的,除此之外,bash還具備記錄命令、文件或命令的補全功能、環境變量的使用等,下面我們會介紹bash的發展以及常用的特性.本章的內容,是一個呈上啟一下的東西,在以后的主機維護中作用很大,務必掌握.
硬件內核與Shell的關系
我們都知道,管理整個計算機硬件的其實是操作系統的內核(kernel),這個內核是需要被保護的,設想一下如果我們不對內核進行保護的話,每個人都可以隨意操作,那么是不是很糟糕,『用不了多久,你的系統就完犢子了』,根據這種請款,我們就開發出了,用戶接口,簡稱Shell,一般使用者是通過 shell 來跟內核溝通的,以讓內核達到我們所想要達到的工作,那么系統有多少 shell 可用呢? 為什么我們要使用 bash 呢? 接下來我們就開始細細的研究一下吧.
有時候我們想給系統下達命令,我們必須通過Shell與內核進行通信,好讓內核可以正確無誤的進行工作,其實Shell的功能只是提供用戶操作系統的一個接口,因此這個Shell程序需要可以調用其他軟件才好,我們在前面提到過的很多命令,包括 man, chmod, chown, vi, fdisk, mkfs 等,這些命令都是獨立的應用程序,但是我們可以通過Shell程序(就是命令行模式)來操作這些應用程序,讓這些應用程序調用內核,來運行所需的工作.
換句話說,只要能夠操作應用程序的接口都能夠稱為Shell程序,狹義的Shell程序指的是命令行方面的軟件,包括本章要介紹的 bash 等,廣義的Shell程序則包括圖形接口的軟件,例如 X-Window 因為圖形接口其實也能夠操作各種應用程序來調用內核工作,不過我們常用的Shell還是Bash,因為其簡潔明了,方便管理.
系統中的默認合法Shell
知道什么是 Shell 之后,那么我們來了解一下Linux系統可以使用的Shell接口,其實Linux系統有很多Shell,由於早年的 Unix 年代,發展者眾多,又因為Linux起源於Unix,所以由於 shell 依據發展者的不同就有許多的版本,例如常聽到的 Bourne SHell (sh) 、在 Sun 里頭默認的 C SHell、 商業上常用的 K SHell、還有 TCSH 等,每一種 Shell 都各有其特點,至於 Linux 使用的這一種版本就稱為『 Bourne Again SHell (簡稱 bash) 』,這個 Shell 是 Bourne Shell 的增強版本,也是基准於 GNU 的架構下發展出來的.
下面我們先來介紹一下Shell的簡單歷史吧,第一個流行的 shell 是由 Steven Bourne 發展出來的,為了紀念他所以就稱為 Bourne shell 或直接簡稱為 sh .而后來另一個廣為流傳的 shell 是由柏克萊大學的 Bill Joy 設計依附於 BSD 版的 Unix 系統中的 shell 這個 shell 的語法有點類似 C 語言,所以才得名為 C shell 簡稱為 csh .由於在學術界 Sun 主機勢力相當的龐大,而 Sun 主要是 BSD 的分支之一,所以 C shell 也是另一個很重要而且流傳很廣的 shell 之一 .
在Linux系統中,常用的shell可以在/etc/shells文件中查到.
● /bin/sh (已經被 /bin/bash 所取代)
● /bin/bash (就是 Linux 默認的 shell)
● /bin/ksh (Kornshell 由 AT&T Bell lab. 發展出來的,兼容於 bash)
● /bin/tcsh (整合 C Shell ,提供更多的功能)
● /bin/csh (已經被 /bin/tcsh 所取代)
● /bin/zsh (基於 ksh 發展出來的,功能更強大的 shell)
上面我們可以看到有很多Shell的程序,我們作為初學者,最應該掌握的就是Bash,因為他是系統的默認Shell,還有一些特殊的Shell這里沒有列出,比如:/sbin/nologin這個無法登陸的Shell.
Bash-Shell的常用功能
既然 /bin/bash 是 Linux 默認的 shell 那么總是得了解一下這個Shell有哪些特性吧,bash 是 GNU 計划中重要的工具軟件之一,目前也是 Linux 發行版的標准 shell ,bash 兼容於 sh ,下面我們看一下bash到底有哪些特點吧,好讓我們以后的使用更加得心應手.
● 命令記憶功能(history)
在默認的Linux環境中,我認為Bash最贊的功能,就是它的命令記憶功能了,其默認的記憶功能,可達到記憶1000條命令,也就是說,你曾經執行過的命令1000條以內會被記錄下來,超出部分會自動清除.
你或許會有個疑問,命令被記錄到哪里了呢?其實我們的命令在退出終端是是記錄在內存中的,當用戶正式退出終端是會自動寫入到,自己家目錄,名字為.bash_history文件當中.雖然我們可以自己設置記錄條數,但是建議設置條目小一些,因為一旦你的系統被黑客入侵,那么他可以通過翻閱你的命令執行找到一些核心數據.
● 命令與文件補全(TAB)
在使用Linux時,有時候我們會忘記一些命令的具體參數,此時我們可以通過命令補全功能,來實現補全.補全的按鍵是TAB.靈活運用命令補全功能,不但可以提高輸入效率,還能減小誤輸入概率.實在是,棒棒噠!
● 命令別名(alias)
有時候我們需要給指定命令設置別名,比如說,一個命令過長,我們可以使用Bash提供的這一特性來將其簡化一下.
● Bash程序腳本(Shell)
在Linux上面,Shell腳本發揮着及其強大的功能,我們的主機管理,日常維護,都離不開Shell腳本的支持.
● Shell通配符
除了以上功能外,BASH還支持很多簡單的通配符,這對於我們的維護減小了很大的負擔.
Bash-Shell常用命令
好了,看了這么多理論,是不是有點懵圈,沒關系,我也懵了,不過接下來,我們來點干貨,開始實戰,看一下Bash常用的相關命令吧.前面的理論可以不看,會操作就行.
◆alias 設置別名◆
alias命令用來設置指令的別名,我們可以使用該命令可以將一些較長的命令進行簡化,使用alias時,用戶必須使用單引號''將原來的命令引起來,防止特殊字符導致錯誤,alias命令的作用只局限於該次登入的操作,若要每次登入都能夠使用這些命令別名,則可將相應的alias命令存放到bash的初始化文件 /etc/bashrc
中,如果是對指定用戶生效則要寫入用戶家目錄中的 ~/.bashrc
中.
這里我不得不羅嗦一下,關於不同類型命令的執行順序,面試時可能會問到.
NO.1 用絕對路徑或相對的方式執行命令
NO.2 別名命令
NO.3 bash 內置命令
NO.4 根據環境變量定義的目錄查詢找到的命令
[root@localhost ~]# alias --help
命令語法:[ alias [原命令]="新命令" ]
-p #打印已經設置的命令別名
[root@localhost ~]# unalias --help
命令語法:[ unalias [命令] ]
◆history 歷史命令◆
history命令用於顯示指定數目的指令命令,讀取歷史命令文件中的目錄到歷史命令緩沖區和將歷史命令緩沖區中的目錄寫入命令文件,該命令單獨使用時,僅顯示歷史命令,在命令行中,可以使用符號!執行指定序號的歷史命令.例如:要執行第2個歷史命令,則輸入!2.
歷史命令是被保存在內存中的,當退出或者登錄shell時,會自動保存或讀取.在內存中,歷史命令僅能夠存儲1000條歷史命令,該數量是由環境變量HISTSIZE進行控制.
[root@localhost ~]# history --help
命令語法:[ history [選項] ]
-c #清空當前歷史命令
-a #將歷史命令緩沖區中命令寫入歷史命令文件中
-r #將歷史命令文件中的命令讀入當前歷史命令緩沖區
-w #將當前歷史命令緩沖區命令寫入歷史命令文件中
"!n" #重復執行第n條歷史命令
"!!" #重復執行上一條命令
"!字符" #重復執行最近一條以此字符開頭的命令
◆ulimit 磁盤限制◆
ulimit命令用來限制系統用戶對shell資源的訪問,想象一個狀況:我的 Linux 主機里面同時登陸了十個人,這十個人不知怎么搞的,同時開啟了 100 個文件,每個文件的大小約 10MBytes,請問一下,我的 Linux 主機的內存要有多大才夠,10*100*10 = 10000 MBytes = 10GBytes
這樣我們的Linux就完蛋了,為了要預防這個情況的發生,所以我們的 bash 是可以『限制用戶的某些系統資源』的,包括可以開啟的文件數量,可以使用的 CPU 時間,可以使用的內存總量等等.
[root@localhost ~]# ulimit --help
命令語法:[ ulimit [選項] ]
-c #清空當前歷史命令
-H #嚴格限制,不能超過此限制
-S #寬限模式,可超過,超過后有警告
-a #列出所有系統限額信息
-f #此Shell可創建的最大容量,默認KB
-d #進程可用最大斷裂內存(seqment)容量
-l #可用於鎖定的內存(lock)量
-t #可使用最大CPU時間,(單位為秒)
-u #單一用戶可使用最大進程數量
來看一下它的結果的解析吧.
[root@localhost ~]# ulimit -a
core file size (blocks, -c) 0 #core文件的最大值為100 blocks
data seg size (kbytes, -d) unlimited #進程的數據段可以任意大
scheduling priority (-e) 0
file size (blocks, -f) unlimited #文件可以任意大
pending signals (-i) 98304 #最多有98304個待處理的信號
max locked memory (kbytes, -l) 32 #一個任務鎖住的物理內存的最大值為32KB
max memory size (kbytes, -m) unlimited #一個任務的常駐物理內存的最大值
open files (-n) 1024 #一個任務最多可以同時打開1024的文件
pipe size (512 bytes, -p) 8 #管道的最大空間為4096字節
POSIX message queues (bytes, -q) 819200 #POSIX的消息隊列的最大值為819200字節
real-time priority (-r) 0
stack size (kbytes, -s) 10240 #進程的棧的最大值為10240字節
cpu time (seconds, -t) unlimited #進程使用的CPU時間
max user processes (-u) 98304 #當前用戶同時打開的進程(包括線程)的最大個數為98304
virtual memory (kbytes, -v) unlimited #沒有限制進程的最大地址空間
file locks (-x) unlimited #所能鎖住的文件的最大個數沒有限制
## Bash-Shell操作環境
是否記得我們登陸主機的時候,屏幕上頭會有一些說明文字,告知我們的 Linux 版本啊什么的,還有登陸的時候我們還可以給予用戶一些信息或者歡迎文字,此外,我們習慣的環境變量、命令別名等等的,是否可以登陸就主動的幫我配置好,這些都是需要注意的,下面我們就來介紹一下吧.
關於Bash的登陸tty終端提示信息
其實我們的Bash也有登陸提示信息的,細心的你也會發現,當我們登陸Linux系統時,默認會提示,Linux的版本等相關信息,這些登陸tty的相關信息是在 /etc/issue
這個配置文件中保存的,我們可以看一下它的結構.
[root@localhost ~]# cat /etc/issue
\S
Kernel \r on an \m
上圖可以看到,里面默認有三行,issue里面的內容,是可以使用反斜杠作為變量調用的,我們下面來具體看一下它所支持的的代碼.
代碼 | issue內的各代碼的意義 |
---|---|
\d | 本地端時間的日期 |
\l | 顯示第幾個終端機接口 |
\m | 顯示硬件等級 |
\n | 顯示主機網絡名稱 |
\o | 顯示domain name |
\r | 操作系統版本 |
\t | 顯示本地端的時間 |
\s | 顯示操作系統名稱 |
\v | 顯示操作系統版本 |
如果我們想定制自己的登陸界面的話,我們可以修改這個配置文件,制作出屬於自己的登陸界面.此時你還需要注意的是,除了issue文件外,還有一個issue.net的配置文件,這個是提供給telnet的遠程登陸程序用的,當用戶用telnet方式登陸主機時,就會自動讀取 /etc/issue.net
這個配置文件里的信息,並輸出到屏幕上.
關於Bash通過SSH登陸的提示信息
如果,你想讓通過SSH登陸的用戶,登陸成功后取得一些信息的話,那么可以講信息加入到 /etc/motd
這個文件里,當用戶下次登陸時,就會默認顯示里面的內容.
例如,我們寫入警告信息,讓每個登陸用戶下次登陸自動顯示.
[root@localhost ~]# cat /etc/motd
===============================================================
警告:您的操作已被記錄
===============================================================
接下來我們通過 ssh
來模擬登陸一下,看一下效果.
[root@localhost ~]# ssh root@192.168.1.10
root@192.168.1.10 password:
Last failed login: Sat Nov 24 15:28:30 EST 2018 from 192.168.1.20 on ssh:notty
There was 1 failed login attempt since the last successful login.
Last login: Sat Nov 24 15:26:36 2018 from 192.168.1.20
================================================================
警告:您的操作已被記錄
===============================================================
Bash的環境配置文件,與相關調用順序
你是否會覺得奇怪,怎么我們什么動作都沒有進行,但是一進入 bash 就取得一堆有用的變量了,這是因為系統有一些環境配置文件案的存在,讓 bash 在啟動時直接讀取這些配置文件,以規划好 bash 的操作環境,而這些配置文件又可以分為全體系統的配置文件以及用戶個人偏好配置文件.接下來,我們就來看看常用的配置文件以及調用順序吧.
/etc/profile
這是一個系統全局配置文件,每個用戶登錄取得Bash時一定會讀取次配置文件,加載一些配置參數,當此配置文件執行的時候還會調用其他的配置文件,比如下面的這幾個.
/etc/profile
首先調用/etc/inputrc
其實這個文件並沒有被運行,/etc/profile 會主動的判斷使用者有沒有自定義輸入的按鍵功能,如果沒有的話,/etc/profile 就會決定配置『INPUTRC=/etc/inputrc』這個變量,此一文件內容為 bash 的熱鍵啦、[tab]要不要有聲音啦等等的數據.不建議修改這個文件
/etc/profile
其次調用/etc/profile.d/.sh
這個目錄內有很多文件,只要在 /etc/profile.d/ 這個目錄內且擴展名為 .sh 並且使用者能夠具有讀權限那么該文件就會被 /etc/profile調用,如果你需要幫所有使用者配置一些共享的命令別名時,可以在這個目錄底下自行創建擴展名為 .sh 的文件,並將所需要的數據寫入即可.
上面的說明,我們可以看出,其實只有 /etc/profile 被調用啦,但是 /etc/profile 還會調用出其他的配置文件,所以讓我們的 bash 操作接口變的非常的友善啦.
~./bash_profile
bash 在讀完了整體環境配置的 /etc/profile 並借此調用其他配置文件后,接下來則是會讀取使用者的個人配置文件.所讀取的個人偏好配置文件其實主要有三個,依序分別是:
~/.bash_profile
-->~/.bash_login
-->~/.prifile
其實 bash 只會讀取上面三個文件的其中一個,而讀取的順序則是依照上面的順序,也就是說,如果 ~/.bash_profile 存在,那么其他兩個文件不論有無存在,都不會被讀取.如果 ~/.bash_profile 不存在才會去讀取 ~/.bash_login,而前兩者都不存在才會讀取 ~/.profile 的意思.
~/.bash_history
默認的情況下,我們的歷史命令就記錄在這里,而這個文件能夠記錄多少數據,則與 HISTFILESIZE 這個變量有關,每次登陸 bash 后,bash 會先讀取這個文件,將所有的歷史命令讀入內存,因此當我們登陸 bash 后就可以查看以前使用過的命令啦.
~/.bash_logout
當系統用戶注銷時,系統會讀取此配置文件,你可以去讀取一下這個文件的內容,默認的情況下注銷時bash 只是幫我們清掉屏幕的信息而已.不過,你也可以將一些備份或者是其他你認為重要的工作寫在這個文件中(例如清空緩存盤),那么當你離開 Linux 的時候,就可以解決一些煩人的事情.
具體的調用情況,下面一張圖,搞定.
1.首先執行主配置下的:
/etc/profile
2.執行主配置目錄下的:/etc/profile.d/*.sh
3.執行當前家目錄下的:~/.bash_profile
4.執行當前家目錄下的:~/.bashrc
5.最后執行主配置下的:/etc/bashrc
以上就是,系統加載環境變量的全部過程!
Shell快捷鍵與通配符
◆Bash 常用快捷鍵◆
Bashe這個默認shell支持一些,比較常用的快捷鍵,這些快捷鍵,對於命令行下的操作,大有好處,你應該好好掌握這些按鍵.
快捷鍵 | 作用 |
---|---|
ctrl+A | 將光標移動到命令開頭 |
ctrl+E | 將光標移動到命令結尾 |
ctrl+C | 強制終止當前命令 |
ctrl+L | 清屏 |
ctrl+U | 刪除或剪切光標之前的命令 |
ctrl+K | 刪除或剪切光標之后的命令 |
ctrl+Y | 粘貼,ctrl+U或ctrl+K的內容 |
ctrl+R | 在歷史命令中搜索,按下后會出現搜索命令 |
ctrl+D | 退出當前終端 |
ctrl+Z | 暫停,並放入后台 |
ctrl+S | 暫停屏幕輸出 |
ctrl+Q | 恢復屏幕輸出 |
◆Bash 常用通配符◆
通 配 符 | 作 用 |
---|---|
? | 匹配任意一個字符 |
* | 匹配0個或多個任意字符,也就是可以匹配任何內容 |
[] | 匹配括號內的任意一個字符 例如:[abc],在abc中任選一個 |
[-] | 匹配一定范圍的字符 例如:[a-z],在a-z之間的都可以被匹配 |
[^] | 邏輯非,匹配不包括,括號內的字符 |
[1] | 匹配開頭是,括號內的字符 |
[] | 匹配開頭不是,括號內的字符 |
實例1:使用 ?
匹配任意一個字符,匹配開頭任意一個字符,只能匹配一個字符.
[root@localhost ~]# ls
123 1233 12333 abbc abc abcc abccc admin lyshark multiuser rui sec wang
[root@localhost ~]# ls ?ang
wang
實例2:使用 *
匹配0個或多個任意字符,也就是可以匹配任何內容
[root@localhost ~]# ls
123 1233 12333 abbc abc abcc abccc admin lyshark multiuser rui sec wang
[root@localhost ~]# ls *
123 1233 12333 abbc abc abcc abccc admin lyshark multiuser rui sec wang
[root@localhost ~]# ls *ang
wang
實例3:使用 [-]
匹配范圍,匹配一個范圍
[root@localhost ~]# ls
123 1233 12333 abbc abc abcc abccc admin lyshark lyssark multiuser rui sec wang
[root@localhost ~]# ls lys[a-z]ark
lyshark lyssark
實例4:使用 ^[]
匹配開頭是0-9的任意字符
[root@localhost ~]# ls
123 1233 12333 abbc abc abcc abccc admin lyshark lyssark multiuser rui sec wang
[root@localhost ~]# ls [0-9]*
123 1233 12333
實例5:使用 ^[^]
匹配開頭不是0-9的任意字符
[root@localhost ~]# ls
123 1233 12333 abbc abc abcc abccc admin lyshark lyssark multiuser rui sec wang
[root@localhost ~]# ls [^0-9]*
abbc abc abcc abccc admin lyshark lyssark multiuser rui sec wang
◆bash 特殊通配符◆
符 號 | 作 用 |
---|---|
'' | 單引號:在單引號中的內容,全部會脫意,它是脫意字符. |
"" | 雙引號:雙引號內,擁有$調用變量,引用命令,和轉義符的特殊含義. |
`` | 反引號:反引號內會被當成命令解析,先執行 |
$() | $加括號:同反引號作用相同,執行解析命令 |
() | 小括號:用於命令執行,小括號中的命令會在子shell中執行 |
{} | 中括號:用於命令執行,中括號中的命令會在當前shell中執行 |
[] | 大括號:用於測試變量 |
# | 警號:在shell腳本中,警號表示注釋 |
$ | $符號:用於調用變量值 |
\ | 轉義符:用於轉義\之后的內容不被執行 |
單引號與雙引號: 單引號當中的特殊字符被脫意了,而雙引號也是脫意,但是$和\不會脫意
[root@localhost ~]# name=lyshark
[root@localhost ~]# echo '$name'
$name
[root@localhost ~]# echo "$name"
lyshark
[root@localhost ~]# echo "{{{ lyshark"
{{{ lyshark
單引號與反引號: 單引號和雙引號會脫意,在雙引號中的反引號會執行
[root@localhost ~]# echo 'date'
date
[root@localhost ~]# echo "date"
date
[root@localhost ~]# echo '`date`'
`date`
[root@localhost ~]# echo "`date`"
Sun Sep 23 22:56:34 EDT 2018
[root@localhost ~]# echo $(date)
Sun Sep 23 22:56:46 EDT 2018
反引號與$() 關於反引號,和$()兩種都是命令執行
[root@localhost /]# echo ls
ls
[root@localhost /]# echo `ls`
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
[root@localhost /]# echo $(ls)
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
關於小括號,中括號,和大括號的說明
● ()執行一串命令時,需要重新開一個子shell進行執行
● {}執行一串命令時,是在當前shell執行
● ()和{}都是把一串的命令放在括號里面,並且命令之間用;號隔開
● ()最后一個命令可以不用分號
● {}最后一個命令要用分號
● {}的第一個命令和左括號之間必須要有一個空格
● ()里的各命令不必和括號有空格
小括號: ()執行命令時,新開一個子shell執行
[root@localhost ~]# name=lyshark
[root@localhost ~]# ( name=bash;echo $name )
bash
[root@localhost ~]# echo $name
lyshark
中括號:{}執行命令時,會在當前shell中執行
[root@localhost ~]# name=lyshark
[root@localhost ~]# { name=bash;echo $name; }
bash
[root@localhost ~]# echo $name
bash
[root@localhost ~]#
Shell的數據流重定向
| 設備 | 設備文件名 | 文件描述符 | 類型 |
|:--------|:-------------😐:---------:||:----------😐
| 鍵盤 | /dev/stdin | 0 | 標准輸入 |
| 顯示器 | /dev/stdout | 1 | 標准正確輸出 |
| 顯示器 | /dev/stderr | 2 | 標准錯誤輸出 |
| 垃圾桶 | /dev/null | | 垃圾桶 |
類型 | 符號 | 作用 |
---|---|---|
標准輸出重定向 | 命令 > 文件 | 以覆蓋的方式,把命令的正確輸出輸出到指定文件或設備中 |
命令 >> 文件 | 以追加的方式,把命令的正確輸出輸出到指定的文件或設備當中 | |
標准錯誤輸出重定向 | 錯誤命令 2 > 文件 | 以覆蓋方式,把命令的錯誤輸出輸出到指定的文件或設備中 |
錯誤命令 2>> 文件 | 以追加的方式,把命令的錯誤輸出輸出到指定文件或設備中 | |
正確輸出和錯誤輸出同時保存 | 命令 > 文件 2>&1 | 以覆蓋的方式,把正確輸出和錯誤輸出同時保存到一個文件中 |
命令 >> 文件 2>&1 | 以追加的方式,把正確輸出和錯誤輸出同時保存到一個文件中 | |
命令 &>文件 | 以覆蓋的方式,把正確輸出和錯誤輸出同時保存到同一個文件中 | |
命令 &>>文件 | 以追加的方式,把正確輸出和錯誤輸出都保存到同一個文件當中 | |
命令 >> 文件1 2>>文件2 | 把正確的輸出追加到文件1中,把錯誤輸出追加到文件2中 |
本小結內容相當的簡單,這里就不再介紹了.結束
Bash-Shell管道命令
◆sort 排序命令◆
sort命令是在Linux里非常有用,它將文件進行排序,並將排序結果標准輸出,sort命令既可以從特定的文件,也可以從stdin中獲取輸入.
[root@localhost ~]# sort --help
語法格式:[ sort [選項] ]
-a #顯示所有文件,包括隱藏文件,連同.與..的文件也列出來
-f #忽略大小寫
-b #忽略每行前的空白部分
-n #以數值型進行排序,默認使用字符串類型排序
-r #反向排序
-u #刪除重復行(=下面的uniq)
-t #指定分隔符,默認分割符是制表符
-k n[,m] #按照指定字段范圍排序,從n字段開始到m字段結束
實例1: sort 命令默認使用每行開頭第一個字符進行排序
[root@localhost ~]# sort /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
....省略....
實例2: 進行反向排序則需要加 -r 選項
[root@localhost ~]# sort -r /etc/passwd
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
root:x:0:0:root:/root:/bin/bash
....省略....
實例3: 按照指定的排序字段進行字符排序,使用 -t 指定分割符,並且使用 -k 指定段號
[root@localhost ~]# sort -t ":" -k 3 /etc/passwd #以:作為分隔符,排序是按照第三段排列
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
....省略....
實例4: 上面的例子,排序方式是字符排序,而加上 -n 之后成為了數值排序
[root@localhost ~]# sort -n -t ":" -k 3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
....省略....
[root@localhost ~]# sort -n -t ":" -k 3,4 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
....省略....
◆wc 字數統計◆
wc命令用來計算數字,利用wc指令我們可以計算文件的Byte數、字數或是列數,若不指定文件名稱,或是所給予的文件名為"-" 則wc指令會從標准輸入設備讀取數據.
[root@localhost ~]# wc --help
語法格式:[ wc [選項] 文件名 ]
-c #統計字數(字符)
-w #統計單詞數(字符串)
-l #統計行數
◆uniq 取消重復行◆
uniq命令用於報告或忽略文件中的重復行,一般與sort命令結合使用.
[root@localhost ~]# uniq --hlep
語法格式:[ uniq [選項] ]
-i #忽略大小寫
-c #在每列旁邊顯示該行重復出現的次數
-d #僅顯示重復出現的行列
-f #忽略比較指定的欄位
-s #忽略比較指定的字符
-u #僅顯示出一次的行列
-w #指定要比較的字符
實例1: 單獨過濾,不排序,uniq命令只能過濾緊挨着的重復行
[root@localhost ~]# cat lyshark.log
123123
123123
qwrtyyu
sasdfgh
1234wsx
123123
ffffgh
123123
[root@localhost ~]# cat lyshark.log |uniq
123123
qwrtyyu
sasdfgh
1234wsx
123123
ffffgh
123123
實例2: 先排序再過濾,既可以過濾掉所有重復行
[root@localhost ~]# cat lyshark.log
123123
123123
qwrtyyu
sasdfgh
1234wsx
123123
ffffgh
123123
[root@localhost ~]# cat lyshark.log | sort |uniq
123123
1234wsx
ffffgh
qwrtyyu
sasdfgh
◆tr 文本轉換命令◆
tr命令可以對來自標准輸入的字符進行替換、壓縮和刪除,它可以將一組字符變成另一組字符,經常用來編寫優美的單行命令,作用很強大.
[root@localhost ~]# tr --hlep
語法格式:[ tr [選項] ]
-d #刪除信息中的,SET1這個字符串.
-s #替換掉重復字符串
-c #取代所有不屬於第一字符集的字符
-t #先刪除第一字符集較第二字符集多出的字符
實例1: 將last命令中的小寫字符,全部變成大寫(小寫->大寫)
[root@localhost ~]# who
root pts/0 2018-11-25 07:43 (192.168.1.20)
[root@localhost ~]# who | tr '[a-z]' '[A-Z]'
ROOT PTS/0 2018-11-25 07:43 (192.168.1.20)
實例2: 將 /etc/passwd
中的冒號全部刪除
[root@localhost ~]# cat /etc/passwd | tr -d ":"
rootx00root/root/bin/bash
binx11bin/bin/sbin/nologin
daemonx22daemon/sbin/sbin/nologin
admx34adm/var/adm/sbin/nologin
lpx47lp/var/spool/lpd/sbin/nologin
....省略....
◆col 文本過濾器◆
col命令是一個標准輸入文本過濾器,它從標注輸入設備讀取文本內容,並把內容顯示到標注輸出設備.在許多UNIX說明文件里,都有RLF控制字符.當我們運用shell特殊字符>和>> 把說明文件的內容輸出成純文本文件時,控制字符會變成亂碼,col命令則能有效濾除這些控制字符.
[root@localhost ~]# col --help
語法格式:[ tr [選項] ]
-x #將TAB鍵轉換為對等的空格
-b #過濾掉所有的控制字符,包括RLF和HRLF
◆join 連接文件◆
join命令用來將兩個文件中,制定欄位內容相同的行連接起來.找出兩個文件中,指定欄位內容相同的行,並加以合並,再輸出到標准輸出設備.
[root@localhost ~]# join --help
語法格式:[ join [選項] ]
-t #默認以空格符分割數據
-i #忽略大小寫差異
-1 #代表第一個文件用那個字段來分析
-2 #代表第二個文件用那個字段來分析
實例: 將/etc/passwd
和/etc/shadow
相同的行,連接在一起
[root@localhost ~]# head -n 3 /etc/passwd /etc/shadow
==> /etc/passwd <==
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
==> /etc/shadow <==
root:$6$gMIJWbnKgxk.lpzY$t3l0u.PNORfSTrjLIdizynMF5uA8LwnSth1tGS/2/89sPiMjVMGdKBPtmUNPYeaeeNRky..xh9Y7FS6LGqSu1/::0:99999:7:::
bin:*:17492:0:99999:7:::
daemon:*:17492:0:99999:7:::
[root@localhost ~]# join -t ":" /etc/passwd /etc/shadow |head -n 3
root:x:0:0:root:/root:/bin/bash:$6$gMIJWbnKgxk.lpzY$t3l0u.PNORfSTrjLIdizynMF5uA8LwnSth1tGS/2/89sPiMjVMGdKBPtmUNPYeaeeNRky..xh9Y7FS6LGqSu1/::0:99999:7:::
bin:x:1:1:bin:/bin:/sbin/nologin:*:17492:0:99999:7:::
daemon:x:2:2:daemon:/sbin:/sbin/nologin:*:17492:0:99999:7:::
◆paste 連接文件◆
這個命令,相對於join就簡單多了,paste是直接將兩個文件貼在一起,且中間以TAB隔開而已.
[root@localhost ~]# paste --help
語法格式:[ paste [選項] ]
-d #后面可接分隔符,默認是TAB來分割
實例: 實現文本的連接
[root@localhost ~]# paste /etc/passwd /etc/shadow | head -n 3
root:x:0:0:root:/root:/bin/bash root:$6$gMIJWbnKgxk.lpzY$t3l0u.PNORfSTrjLIdizynMF5uA8LwnSth1tGS/2/89sPiMjVMGdKBPtmUNPYeaeeNRky..xh9Y7FS6LGqSu1/::0:99999:7:::
bin:x:1:1:bin:/bin:/sbin/nologin bin:*:17492:0:99999:7:::
daemon:x:2:2:daemon:/sbin:/sbin/nologin daemon:*:17492:0:99999:7:::
◆expand 轉空格◆
expand命令用於將文件的制表符(TAB)轉換為空白字符(space),將結果顯示到標准輸出設備.
[root@localhost ~]# expand --help
語法格式:[ expand [選項] ]
-t #后面接數字,轉換成幾個空格
◆split 文本切割◆
split命令可以將一個大文件分割成很多個小文件,有時需要將文件分割成更小的片段,比如為提高可讀性,生成日志等.
[root@localhost ~]# split --help
語法格式:[ split [選項] [大小] [文件] ]
-b #后面可跟切割大小,可跟b,m,k
-l #以行數來進行切割
◆xargs 代數轉換◆
xargs命令是給其他命令傳遞參數的一個過濾器,也是組合多個命令的一個工具,它擅長將標准輸入數據轉換成命令行參數,xargs能夠處理管道或者stdin並將其轉換成特定命令的命令參數.xargs也可以將單行或多行文本輸入轉換為其他格式,例如多行變單行,單行變多行.xargs的默認命令是echo,空格是默認定界符,這意味着通過管道傳遞給xargs的輸入將會包含換行和空白,不過通過xargs的處理,換行和空白將被空格取代.xargs是構建單行命令的重要組件之一.
[root@localhost ~]# xargs --help
[小例子]
[root@localhost ~]# echo "-lh" |ls
anaconda-ks.cfg
[root@localhost ~]# echo "-lh" |xargs ls
total 4.0K
-rw-------. 1 root root 1.2K Sep 18 09:12 anaconda-ks.cfg
實例1: 通過使用 xargs
將多行文本轉換成單行
[root@localhost ~]# cat lyshark.log
a b c d e f g
h i j k l m n
[root@localhost ~]# cat lyshark.log | xargs
a b c d e f g h i j k l m n
實例2: 通過 xargs -n
指定每行打印的行數
[root@localhost ~]# cat lyshark.log
a b c d e f g
h i j k l m n
[root@localhost ~]# cat lyshark.log | xargs -n3
a b c
d e f
g h i
j k l
m n
實例3: 通過 xargs -d
指定一個限定符
[root@localhost ~]# echo "nameXnameXnameXname" | xargs -dX
name name name name
[root@localhost ~]# echo "nameXnameXnameXname" | xargs -dX -n2
name name
name name
參考文獻:Linux鳥哥私房菜,Linux運維之道