簡介
grep (global search regular expression(RE) and print out the line,全面搜索正則表達式並把行列印出來)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行列印出來。
Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的擴展,支持更多的re元字元, fgrep就是fixed grep或fast grep,它們把所有的字母都看作單詞,也就是說,正則表達式中的元字元表示回其自身的字面意義,不再特殊。linux使用GNU版本的grep。它功能更強,可以通過-G、-E、-F命令行選項來使用egrep和fgrep的功能。
grep常用用法
[root@www ~]#grep[-acinv] [--color=auto]'搜尋字元串' filename
選項與參數:-a :將 binary 文件以 text 文件的方式搜尋數據-c :計算找到'搜尋字元串' 的次數-i :忽略大小寫的不同,所以大小寫視為相同-n :順便輸出行號-v :反向選擇,亦即顯示出沒有'搜尋字元串' 內容的那一行!--color=auto :可以將找到的關鍵詞部分加上顏色的顯示喔!
將/etc/passwd,有出現 root 的行取出來
# greproot /etc/passwdroot:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
或# cat/etc/passwd|grep root
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
將/etc/passwd,有出現 root 的行取出來,同時顯示這些行在/etc/passwd的行號
#grep-n root /etc/passwd1:root:x:0:0:root:/root:/bin/bash30:operator:x:11:0:operator:/root:/sbin/nologin
在關鍵字的顯示方面,grep 可以使用 --color=auto 來將關鍵字部分使用顏色顯示。 這可是個很不錯的功能啊!但是如果每次使用 grep 都得要自行加上 --color=auto 又顯的很麻煩~ 此時那個好用的 alias 就得來處理一下啦!你可以在 ~/.bashrc 內加上這行:『alias grep='grep --color=auto'』再以『 source ~/.bashrc 』來立即生效即可喔! 這樣每次運行 grep 他都會自動幫你加上顏色顯示啦
將/etc/passwd,將沒有出現 root 的行取出來
#grep-v root /etc/passwdroot:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
將/etc/passwd,將沒有出現 root 和nologin的行取出來
#grep-v root /etc/passwd|grep-v nologin
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
用 dmesg 列出核心信息,再以 grep 找出內含 eth 那行,要將捉到的關鍵字顯色,且加上行號來表示:
[root@www ~]# dmesg |grep-n --color=auto'eth'247:eth0: RealTek RTL8139 at0xee846000,00:90:cc:a6:34:84, IRQ10248:eth0: Identified8139chip type'RTL-8139C'294:eth0: link up, 100Mbps, full-plex, lpa0xC5E1305:eth0: no IPv6 routers present
# 你會發現除了 eth 會有特殊顏色來表示之外,最前面還有行號喔!
在關鍵字的顯示方面,grep 可以使用 --color=auto 來將關鍵字部分使用顏色顯示。 這可是個很不錯的功能啊!但是如果每次使用 grep 都得要自行加上 --color=auto 又顯的很麻煩~ 此時那個好用的 alias 就得來處理一下啦!你可以在 ~/.bashrc 內加上這行:『alias grep='grep --color=auto'』再以『 source ~/.bashrc 』來立即生效即可喔! 這樣每次運行 grep 他都會自動幫你加上顏色顯示啦
用 dmesg 列出核心信息,再以 grep 找出內含 eth 那行,在關鍵字所在行的前兩行與後三行也一起捉出來顯示
[root@www ~]# dmesg |grep-n -A3 -B2 --color=auto'eth'245-PCI: setting IRQ10as level-triggered246-ACPI: PCI Interrupt0000:00:0e.0[A] -> Link [LNKB] ...247:eth0: RealTek RTL8139 at0xee846000,00:90:cc:a6:34:84, IRQ10248:eth0: Identified8139chip type'RTL-8139C'249-input: PC Speaker as /class/input/input2250-ACPI: PCI Interrupt0000:00:01.4[B] -> Link [LNKB] ...251-hdb: ATAPI 48X DVD-ROM DVD-R-RAM CD-R/RW drive, 2048kB Cache, UDMA(66)
# 如上所示,你會發現關鍵字 247所在的前兩行及248 後三行也都被顯示出來!
# 這樣可以讓你將關鍵字前後數據捉出來進行分析啦!
根據文件內容遞歸查找目錄
#grep『energywise』 * #在當前目錄搜索帶'energywise'行的文件
# grep-r 『energywise』 * #在當前目錄及其子目錄下搜索'energywise'行的文件
# grep-l -r 『energywise』 * #在當前目錄及其子目錄下搜索'energywise'行的文件,但是不顯示匹配的行,只顯示匹配的文件
這幾個命令很使用,是查找文件的利器。
grep與正規表達式
字元類
字元類的搜索:如果我想要搜尋 test 或 taste 這兩個單字時,可以發現到,其實她們有共通的 't?st' 存在~這個時候,我可以這樣來搜尋:
[root@www ~]#grep-n't[ae]st' regular_express.txt8:I can't finish the test.9:Oh! The soup taste good.
其實 [] 裡面不論有幾個位元組,他都謹代表某『一個』位元組, 所以,上面的例子說明了,我需要的字串是『tast』或『test』兩個字串而已!
字元類的反向選擇 [^] :如果想要搜索到有 oo 的行,但不想要 oo 前面有 g,如下
[root@www ~]#grep-n'[^g]oo' regular_express.txt2:apple is my favorite food.3:Football game is not use feet only.18:google is the best toolsfor search keyword.19:goooooogle yes!
第 2,3 行沒有疑問,因為 foo 與 Foo 均可被接受!
但是第 18 行明明有 google 的 goo 啊~別忘記了,因為該行後面出現了 tool 的 too 啊!所以該行也被列出來~ 也就是說, 18 行裡面雖然出現了我們所不要的項目 (goo) 但是由於有需要的項目 (too) , 因此,是符合字串搜尋的喔!
至於第 19 行,同樣的,因為 goooooogle 裡面的 oo 前面可能是 o ,例如: go(ooo)oogle ,所以,這一行也是符合需求的!
字元類的連續:再來,假設我 oo 前面不想要有小寫位元組,所以,我可以這樣寫 [^abcd....z]oo , 但是這樣似乎不怎麼方便,由於小寫位元組的 ASCII 上編碼的順序是連續的, 因此,我們可以將之簡化為底下這樣:
[root@www ~]#grep-n'[^a-z]oo' regular_express.txt3:Football game is not use feet only.
也就是說,當我們在一組集合位元組中,如果該位元組組是連續的,例如大寫英文/小寫英文/數字等等, 就可以使用[a-z],[A-Z],[0-9]等方式來書寫,那麼如果我們的要求字串是數字與英文呢? 呵呵!就將他全部寫在一起,變成:[a-zA-Z0-9]。
我們要取得有數字的那一行,就這樣:
[root@www ~]#grep-n'[0-9]' regular_express.txt5:However, this dress is about $3183 dollars.15:You are the best is mean you are the no.1.
行首與行尾位元組 ^ $
行首字元:如果我想要讓 the 只在行首列出呢? 這個時候就得要使用定位位元組了!我們可以這樣做:
[root@www ~]#grep-n'^the' regular_express.txt12:the symbol'*'is represented as start.
此時,就只剩下第 12 行,因為只有第 12 行的行首是 the 開頭啊~此外, 如果我想要開頭是小寫位元組的那一行就列出呢?可以這樣:
[root@www ~]#grep-n'^[a-z]' regular_express.txt2:apple is my favorite food.4:this dress doesn't fit me.10:motorcycle is cheap than car.12:the symbol'*' is represented as start.18:google is the best toolsfor search keyword.19:goooooogle yes!20:go! go! Let's go.
如果我不想要開頭是英文字母,則可以是這樣:
[root@www ~]#grep-n'^[^a-zA-Z]' regular_express.txt1:"Open Source" is a good mechanism to develop programs.21:# I am VBird
^ 符號,在字元類符號(括弧[])之內與之外是不同的! 在 [] 內代表『反向選擇』,在 [] 之外則代表定位在行首的意義!
那如果我想要找出來,行尾結束為小數點 (.) 的那一行:
[root@www ~]#grep-n'\.$' regular_express.txt1:"Open Source" is a good mechanism to develop programs.2:apple is my favorite food.3:Football game is not use feet only.4:this dress doesn't fit me.10:motorcycle is cheap than car.11:This window isclear.12:the symbol'*' is represented as start.15:You are the best is mean you are the no.1.16:The world is the same with"glad".17:I like dog.18:google is the best toolsfor search keyword.20:go! go! Let's go.
特別注意到,因為小數點具有其他意義(底下會介紹),所以必須要使用轉義字元(\)來加以解除其特殊意義!
找出空白行:
[root@www ~]#grep-n'^$' regular_express.txt22:
因為只有行首跟行尾 (^$),所以,這樣就可以找出空白行啦!
任意一個位元組 . 與重復位元組 *
這兩個符號在正則表達式的意義如下:
. (小數點):代表『一定有一個任意位元組』的意思;* (星號):代表『重復前一個字元,0到無窮多次』的意思,為組合形態
假設我需要找出 g??d 的字串,亦即共有四個位元組, 起頭是 g 而結束是 d ,我可以這樣做:
[root@www ~]#grep-n'g..d' regular_express.txt1:"Open Source" is a good mechanism to develop programs.9:Oh! The soup taste good.16:The world is the same with"glad".
因為強調 g 與 d 之間一定要存在兩個位元組,因此,第 13 行的 god 與第 14 行的 gd 就不會被列出來啦!
如果我想要列出有 oo, ooo, oooo 等等的數據, 也就是說,至少要有兩個(含) o 以上,該如何是好?
因為 * 代表的是『重復 0 個或多個前面的 RE 字元』的意義, 因此,『o*』代表的是:『擁有空位元組或一個 o 以上的位元組』,因此,『 grep -n 'o*' regular_express.txt 』將會把所有的數據都列印出來終端上!
當我們需要『至少兩個 o 以上的字串』時,就需要 ooo* ,亦即是:
[root@www ~]#grep-n'ooo*' regular_express.txt1:"Open Source" is a good mechanism to develop programs.2:apple is my favorite food.3:Football game is not use feet only.9:Oh! The soup taste good.18:google is the best toolsfor search keyword.19:goooooogle yes!
如果我想要字串開頭與結尾都是 g,但是兩個 g 之間僅能存在至少一個 o ,亦即是 gog, goog, gooog.... 等等,那該如何?
[root@www ~]#grep-n'goo*g' regular_express.txt18:google is the best toolsfor search keyword.19:goooooogle yes!
如果我想要找出 g 開頭與 g 結尾的行,當中的字元可有可無
[root@www ~]#grep-n'g.*g' regular_express.txt1:"Open Source" is a good mechanism to develop programs.14:The gd software is a libraryfor drafting programs.18:google is the best toolsfor search keyword.19:goooooogle yes!20:go! go! Let's go.
因為是代表 g 開頭與 g 結尾,中間任意位元組均可接受,所以,第 1, 14, 20 行是可接受的喔! 這個 .* 的 RE 表示任意字元是很常見的.
如果我想要找出『任意數字』的行?因為僅有數字,所以就成為:
[root@www ~]#grep-n'[0-9][0-9]*' regular_express.txt5:However, this dress is about $3183 dollars.15:You are the best is mean you are the no.1.
限定連續 RE 字元范圍 {}
我們可以利用 . 與 RE 字元及 * 來配置 0 個到無限多個重復位元組, 那如果我想要限制一個范圍區間內的重復位元組數呢?
舉例來說,我想要找出兩個到五個 o 的連續字串,該如何作?這時候就得要使用到限定范圍的字元 {} 了。 但因為 { 與 } 的符號在 shell 是有特殊意義的,因此, 我們必須要使用字元 \ 來讓他失去特殊意義才行。 至於 {} 的語法是這樣的,假設我要找到兩個 o 的字串,可以是:
[root@www ~]#grep-n'o\{2\}' regular_express.txt1:"Open Source" is a good mechanism to develop programs.2:apple is my favorite food.3:Football game is not use feet only.9:Oh! The soup taste good.18:google is the best toolsfor search ke19:goooooogle yes!
假設我們要找出 g 後面接 2 到 5 個 o ,然後再接一個 g 的字串,他會是這樣:
[root@www ~]#grep-n'go\{2,5\}g' regular_express.txt18:google is the best toolsforsearch keyword.
如果我想要的是 2 個 o 以上的 goooo....g 呢?除了可以是 gooo*g ,也可以是:
[root@www ~]#grep-n'go\{2,\}g' regular_express.txt18:google is the best toolsfor search keyword.19:goooooogle yes!
擴展grep(grep -E 或者 egrep):
使用擴展grep的主要好處是增加了額外的正則表達式元字元集。
列印所有包含NW或EA的行。如果不是使用egrep,而是grep,將不會有結果查出。
#egrep'NW|EA' testfile
northwest NW Charles Main 3.0.98334 eastern EA TB Savage 4.4.84520
對於標准grep,如果在擴展元字元前面加\,grep會自動啟用擴展選項-E。
#grep'NW\|EA' testfile
northwest NW Charles Main 3.0.98334eastern EA TB Savage 4.4.84520
搜索所有包含一個或多個3的行。
#egrep'3+' testfile
# grep-E'3+' testfile
# grep'3\+' testfile
#這3條命令將會
northwest NW Charles Main 3.0.98334western WE Sharon Gray 5.3.97523northeast NE AM Main Jr. 5.1.94313central CT Ann Stephens 5.7.94513
搜索所有包含0個或1個小數點字元的行。
#egrep'2\.?[0-9]' testfile
# grep-E'2\.?[0-9]' testfile
# grep'2\.\?[0-9]' testfile
#首先含有2字元,其後緊跟著0個或1個點,後面再是0和9之間的數字。
western WE Sharon Gray 5.3.97523southwest SW Lewis Dalsass 2.7.8218eastern EA TB Savage 4.4.84520
搜索一個或者多個連續的no的行。
#egrep'(no)+' testfile
# grep-E'(no)+' testfile
# grep'\(no\)\+' testfile #3個命令返回相同結果,
northwest NW Charles Main 3.0.98334northeast NE AM Main Jr. 5.1.94313north NO Margot Weber 4.5.8959
不使用正則表達式
fgrep 查詢速度比grep命令快,但是不夠靈活:它只能找固定的文本,而不是規則表達式。
如果你想在一個文件或者輸出中找到包含星號字元的行
fgrep '*' /etc/profile
for i in /etc/profile.d/*.sh ; do
或
grep -F '*' /etc/profile
for i in /etc/profile.d/*.sh ; do
2. Linux grep、egrep使用命令詳解
grep egrep區別
grep 默認不支持擴展 但可以通過-E 選擇來支持擴展正則
egrep 支持擴展正則
關於正則與擴展正則的區別可以看我另一篇shell 正則的介紹
文件處理順序 以行為單位,逐行進行處理
默認只輸出與表達式相匹配的文本行
基本用法
- 格式1:egrep [選擇] '正則表達式' 文件
- 格式2:前置命令 | egrep [選擇] '正則表達式'
• egrep命令工具 (擴展正則命令)
• 常用命令選項
•grep 正則表達式,用來查找過濾文檔的工具符號
grep "root" user //在user文檔中查找有單詞root的行
grep "^root" user //在user文檔中查找以單詞root開頭的行
grep "bash " user //查找空行
grep "^ " user //查找以空格開頭的行
grep "[rot]" user //查找字母r或者o或者t
grep "roo[tn]" user //查找root或者roon
grep "[^rot]" user //查找字母r或者o或者t之外的內容
grep "[a-z]" user //查找小寫字母
grep "[A-Z]" user //查找大寫字母
grep "[a-Z]" user //查找所有字母
grep "[0-9]" user //查找數字
grep "r..t" user //查找以r開頭t結尾中間有2個任意字元的單詞
grep "r. " user //查找以r開頭後面任意字元 相當手通配符
grep "ro*" user //查找以r開頭後面有或沒有字母o的單詞,o可以出現任意次
grep "o{1,2}" user //查找o出現1次到2次的行
grep "o{2,3}" user //查找o出現2次到3次的行
grep "o{2}" user //查找o出現2次的行
grep "o{1,} " user //查找o出現1次以及1次以上
grep "(:0){2}" user //查找:0(數字零)連續出現2次的行
擴展正則
egrep "o+" user //查找o出現1次以及1次以上
egrep "o?" user //查找o出現0次或1次
egrep "o{1,2}" user //查找o出現1次到2次的行
egrep "o{2,3}" user //查找o出現2次到3次的行
egrep "o{2}" user //查找o出現2次的行
egrep "o{1,}" user //查找o出現1次以及1次以上
egrep "(:0){2}" user //查找:0(數字零)連續出現2次的行
egrep "bash|nologin" user //查找bash或者nologin
egrep "the" a //查找單詞the,前後是空格或者特殊符號
案例:
正則表達式匹配練習
1)典型的應用場合:grep、egrep檢索文本行
grep命令不帶-E選項時,支持基本正則匹配模式。比如「word」關鍵詞檢索、「^word」匹配以word開頭的行、「word$」匹配以word結尾的行……等等。
輸出以「r」開頭的用戶記錄:
輸出以「localhost」結尾的行:
若希望在grep檢索式同時組合多個條件,比如輸出以「root」或者以「daemon」開頭的行:
而若若使用grep -E或egrep命令,可支持擴展正則匹配模式,能夠自動識別 |、{} 等擴展正則表達式中的特殊字元,用起來更加方便,比如:
或者
使用grep -E 與 使用egrep命令完全等效,推薦使用後者,特別是涉及到復雜的正則表達式的時候。
2)grep、egrep命令的-q選項
選項 -q 表示 quiet(靜默)的意思,結合此選項可以只做檢索而並不輸出,通常在腳本內用來識別查找的目標是否存在,通過返回狀態 $? 來判斷,這樣可以忽略無關的文本信息,簡化腳本輸出。
比如,檢查/etc/hosts文件內是否存在192.168.4.4的映射記錄,如果存在則顯示「YES」,否則輸出「NO」,一般會執行:
這樣grep的輸出信息和腳本判斷後的提示混雜在一起,用戶不易辨別,所以可以改成以下操作:
是不是清爽多了,從上述結果也可以看到,使用 -q 選項的效果與使用 &> /dev/null的效果類似。
3)基本元字元 ^、$ —— 匹配行首、行尾
輸出注釋的配置行(以#開頭的行):
統計本地用戶中登錄Shell為「/sbin/nologin」的用戶個數:
提示: -m10僅在文件的前10行中過濾,後面的行不再過濾。
結合 -c 選項輸出匹配的行數
使用 -c 選項可輸出匹配行數,這與通過管道再 wc -l的效果是相同的,但是寫法更簡便。比如,統計使用「/bin/bash」作為登錄Shell的正常用戶個數,可執行:
或者
4)基本元字元 . —— 匹配任意單個字元
以/etc/rc.local文件為例,確認文本內容:
輸出/etc/rc.local文件內的空行(用 –v 選項將條件取反):
5)基本元字元 +、?、 —— 目標出現的次數*
還以/etc/rc.local文件為例:
輸出包括 f、ff、ff、……的行,即「f」至少出現一次:
輸出包括init、initial的行,即末尾的「ial」最多出現一次(可能沒有):
輸出包括stu、stuf、stuff、stufff、……的行,即末尾的「f」可出現任意多次,也可以沒有。重復目標只有一個字元時,可以不使用括弧:
輸出所有行,單獨的「.*」可匹配任意行(包括空行):
輸出/etc/passwd文件內「r」開頭且以「nologin」結尾的用戶記錄,即中間可以是任意字元:
6)元字元 {} —— 限定出現的次數范圍
創建一個練慣用的測試文件:
輸出包括ababab的行,即「ab」連續出現3次:
輸出包括abab、ababab、abababab的行,即「ab」連續出現2~4次:
輸出包括ababab、abababab、……的行,即「ab」最少連續出現3次:
7)元字元 [] —— 匹配范圍內的單個字元
還以前面的測試文件bracet.txt為例:
輸出包括abc、abd的行,即前兩個字元為「ab」,第三個字元只要是c、d中的一個就符合條件:
輸出包括大寫字母的行,使用[A-Z]匹配連續范圍:
8)單詞邊界匹配
以文件/etc/rc.local為例:
輸出包括單詞「init」的行,文件中「initialization」不合要求:
或者:
輸出包括以「ll」結尾的單詞的行,使用 > 匹配單詞右邊界:
或者:
9)多個條件的組合
通過dmesg啟動日誌查看藍牙設備、網卡設備相關的信息:
3. 求在LINUX下,查找某一目錄下文件的內容包含指定字元的文件名
給定字元串查找文件名,例如,查找當前目錄下所有文件中包含字元串"Linux"的文件,可以使用如下命令:egrepLinux*
舉例:testfile、testfile1中都還有Linux,查找結果如下所示:
$egrepLinux*#查找當前目錄下包含字元串「Linux」的文件
testfile:helloLinux!
testfile:LinuxisafreeUnix-typeoperatingsystem.
testfile:Linux.
testfile1:helLinux!
testfile1:ThisaLinuxtestfile!
(3)linuxegrep擴展閱讀
Linuxegrep命令執行效果與"grep-E"相似,使用的語法及參數可參照grep指令,與grep的不同點在於解讀字元串的方法。
egrep是用extendedregularexpression語法來解讀的,而grep則用basicregular
expression語法解讀,extendedregularexpression比basicregular
expression的表達更規范。
4. Linux文件相關命令
grep命令:
grep命令是非常重要的命令,可以對文本進行查找和搜索
常用參數如下:
常用實例:
1、在多個文件中查找:
grep "file" file_1 file_2 file_3
2、輸出除之外的所有行 -v 選項:
grep -v "file" file_name
3、標記匹配顏色 --color=auto 選項:
grep "file" file_name --color=auto
4、使用正則表達式 -E 選項:
grep -E "[1-9]+"
egrep "[1-9]+"
5、只輸出文件中匹配到的部分 -o 選項:
echo this is a test line. | grep -o -E "[a-z]+."
line.
echo this is a test line. | egrep -o "[a-z]+."
line.
6、統計文件或者文本中包含匹配字元串的行數-c 選項:
grep -c "text" file_name
2
7、輸出包含匹配字元串的行數 -n 選項:
grep "text" -n file_name
或
cat file_name | grep "text" -n
8、多個文件
grep "text" -n file_1 file_2
9、搜索多個文件並查找匹配文本在哪些文件中:
grep -l "text" file1 file2 file3...
10、grep遞歸搜索文件
在多級目錄中對文本進行遞歸搜索:
grep "text" . -r -n
11、忽略匹配樣式中的字元大小寫:
echo "hello world" | grep -i "HELLO"
hello
12、選項 -e 指定多個匹配樣式:
echo this is a text line | grep -e "is" -e "line" -o
is
line
13、也可以使用 -f 選項來匹配多個樣式,在樣式文件中逐行寫出需要匹配的字元。
cat patfile
aaa
bbb
echo aaa bbb ccc ddd eee | grep -f patfile -o
14、在grep搜索結果中包括或者排除指定文件:
只在目錄中所有的.php和.html文件中遞歸搜索字元"main()"
grep "main()" . -r --include *.{php,html}
15、在搜索結果中排除所有README文件
grep "main()" . -r --exclude "README"
16、在搜索結果中排除filelist文件列表裡的文件
grep "main()" . -r --exclude-from filelist
touch abc.txt 創建一個名為abc.txt的文件
touch -r 指定文件時間與參考文件相同
touch -t 201608012234.55[yyyymmddhhmm.ss] abc.txt 更改文件為指定的時間
touch temp 創建一個名為temp的文件
vi編輯器有三種模式,命令行模式、編輯模式、底行模式。
vi 文件名進入命令行模式,Insert進入編輯模式,編輯完成Esc退出編輯模式,:wq進入底行模式並保存修改,:q直接退出保存。
tar命令用於打包壓縮文件,常用的壓縮命令還有bzip2,gzip
bunzip2 file1.bz2 解壓一個叫做 'file1.bz2'的文件
bzip2 file1 壓縮一個叫做 'file1' 的文件
gunzip file1.gz 解壓一個叫做 'file1.gz'的文件
gzip file1 壓縮一個叫做 'file1'的文件
gzip -9 file1 最大程度壓縮
rar a file1.rar test_file 創建一個叫做 'file1.rar' 的包
rar a file1.rar file1 file2 dir1 同時壓縮 'file1', 'file2' 以及目錄 'dir1'
rar x file1.rar 解壓rar包
unrar x file1.rar 解壓rar包
tar -cvf archive.tar file1 創建一個非壓縮的 tarball
tar -cvf archive.tar file1 file2 dir1 創建一個包含了 'file1', 'file2' 以及 'dir1'的檔案文件
tar -tf archive.tar 顯示一個包中的內容
tar -xvf archive.tar 釋放一個包
tar -xvf archive.tar -C /tmp 將壓縮包釋放到 /tmp目錄下
tar -cvfj archive.tar.bz2 dir1 創建一個bzip2格式的壓縮包
tar -xvfj archive.tar.bz2 解壓一個bzip2格式的壓縮包
tar -cvfz archive.tar.gz dir1 創建一個gzip格式的壓縮包
tar -xvfz archive.tar.gz 解壓一個gzip格式的壓縮包
zip file1.zip file1 創建一個zip格式的壓縮包
zip -r file1.zip file1 file2 dir1 將幾個文件和目錄同時壓縮成一個zip格式的壓縮包
unzip file1.zip 解壓一個zip格式壓縮包
which命令用於用戶查找命令所有路徑
命令格式
file命令用於獲取文件屬性
命令格式
file 文件名或目錄名
命令示例:
使用說明
命令格式:cat [-AbeEnstTuv] [--help] [--version] fileName
cat file1 從第一個位元組開始正向查看文件的內容
-n 或 --number:由 1 開始對所有輸出的行數編號。
-b 或 --number-nonblank:和 -n 相似,只不過對於空白行不編號。
-s 或 --squeeze-blank:當遇到有連續兩行以上的空白行,就代換為一行的空白行。
-v 或 --show-nonprinting:使用 ^ 和 M- 符號,除了 LFD 和 TAB 之外。
-E 或 --show-ends : 在每行結束處顯示 $。
-T 或 --show-tabs: 將 TAB 字元顯示為 ^I。
-A, --show-all:等價於 -vET。
-e:等價於"-vE"選項;
-t:等價於"-vT"選項;
使用示例
把 textfile1 的文檔內容加上行號後輸入 textfile2 這個文檔里
cat -n textfile1 > textfile2
把 textfile1 和 textfile2 的文檔內容加上行號(空白行不加)之後將內容附加到 textfile3 文檔里
cat -b textfile1 textfile2 >> textfile3
清空 /etc/test.txt 文檔內容
cat /dev/null > /etc/test.txt
tac [filename]
從最後一行開始反向查看一個文件的內容,ac與cat命令剛好相反,文件內容從最後一行開始顯示,可以看出 tac 是 cat 的倒著寫。
nl [-bnw] 文件
選項與參數:
-b: 指定行號指定的方式,主要有兩種:
-b a :表示不論是否為空行,也同樣列出行號(類似 cat -n);
-b t :如果有空行,空的那一行不要列出行號(默認值);
-n :列出行號表示的方法,主要有三種:
-n ln :行號在熒幕的最左方顯示;
-n rn :行號在自己欄位的最右方顯示,且不加 0 ;
-n rz :行號在自己欄位的最右方顯示,且加 0 ;
-w :行號欄位的佔用的位數。
more file1 查看一個長文件的內容,支持一頁一頁翻動
運行的時候,支持以下幾個按鍵:
空白鍵 (space):代表向下翻一頁;
Enter :代表向下翻『一行』;
/字串 :代表在這個顯示的內容當中,向下搜尋『字串』這個關鍵字;
:f :立刻顯示出檔名以及目前顯示的行數;
q :代表立刻離開 more ,不再顯示該文件內容。
b 或 [ctrl]-b :代表往回翻頁,不過這動作只對文件有用,對管線無用。
less file1 類似於 'more' 命令,但是它允許在文件中和正向操作一樣的反向操作
less運行時可以輸入的命令有:
空白鍵 :向下翻動一頁;
[pagedown]:向下翻動一頁;
[pageup] :向上翻動一頁;
/字串 :向下搜尋『字串』的功能;
?字串 :向上搜尋『字串』的功能;
n :重復前一個搜尋 (與 / 或 ? 有關!)
N :反向的重復前一個搜尋 (與 / 或 ? 有關!)
q :離開 less 這個程序;
head [-n number]
head -2 file1 查看一個文件的前兩行
tail [-n number]
tail -2 file1 查看一個文件的最後兩行
tail -f /var/log/messages 實時查看被添加到一個文件中的內容
文件許可權列中三位為一組,分別代表相關的用戶、組、其它用戶的許可權
許可權列中三位為一組,分別代表相關的用戶、組、其它用戶的許可權
所以修改許可權可以分別修改或一同修改,系統中許可權分為數字許可權與字元許可權
數字許可權:r=4,w=2,x=1
字元許可權:+ 增加 -去除 a取消所有加上給定的
修改許可權的命令chmod,命令格式:
chmod 許可權 文件名或目錄名 修改許可權格式
chmod -R 許可權 目錄名 遞歸將目錄及其下面所有內容許可權全部修改
chown 改變文件或目錄的屬主(所有者)
chown 用戶名 文件名或目錄名
chown 用戶名.組名 文件名或目錄名
修改所屬組也可用chgrp 命令來完成
當你用ls -l 查看到文件的屬主、屬組為數字時,就表明該文件的創建用戶已被刪除。
文件的特殊許可權
chattr +i(-i) 文件名 鎖定文件(取消鎖定)不可刪除與清空
chattr +a(-a) 文件名 添加內容(只可添加內容)
使用lsattr 文件名 查看文件的特殊許可權
由此可以看出
root用戶默認創建的目錄許可權是755,文件許可權是644
普通用戶默認創建的目錄許可權是775,文件許可權是664
這也是系統默認的比較安全的許可權分配,其實這些默認許可權全部都是由umask值來決定的
系統規定了
文件的許可權值是從666開始計算(默認許可權=許可權值-umask值)
目錄的許可權值是從777開始計算(默認許可權=許可權值-umask值)
文件1的許可權=444 (666-232=434——43(3+1)4)
5. Linux裡面grep和egrep命令區別是什麼
基本正則表達式(grep)和拓展正則表達式(egrep)。
而grep和egrep同屬於文本搜索工具,可根據用戶指定的文本模式(搜索條件)對目標文件進行逐行搜索,顯示能匹配到的行。
egrep = grep -E 可以使用基本的正則表達外, 還可以用擴展表達式. 注意區別《Linux就該這么學》.
擴展表達式:
+ 匹配一個或者多個先前的字元, 至少一個先前字元.
? 匹配0個或者多個先前字元.
a|b|c 匹配a或b或c
() 字元組, 如: love(able|ers) 匹配loveable或lovers.
(..)(..)\1\2 模板匹配. \1代表前面第一個模板, \2代第二個括弧裡面的模板.
x{m,n} =x\{m,n\} x的字元數量在m到n個之間.
6. Linux正則表達式與通配符
正則表達式:在計算機科學中,是指一個用來描述或者匹配一系列符合某個句法規則的字元串的單個字元串。在很多文本編輯器或其他工具里,正則表達式通常被用來檢索或替換那些符合某個模式的文本內容。正則表達式這個概念最初是由Unix中的工具軟體(例如sed和grep)普及開的。
只有掌握了正則表達式,才能全面地掌握 Linux 下的常用文本工具(例如:grep、egrep、GUN sed、 Awk 等) 的用法
grep、sed、awk天然支持正則
grep -v代表反選,反向選擇匹配到的內容
grep -E代表使用擴展正則
grep -P代表使用Perl正則
sed -r 代表使用擴展正則
正則表達式分為三類(man grep可以看到,分別是basic RegExs,extended RegExs,perl RegExs)
1、基本的正則表達式(Basic Regular Expression 又叫 Basic RegEx 簡稱 BREs)
2、擴展的正則表達式(Extended Regular Expression 又叫 Extended RegEx 簡稱 EREs)
3、Perl 的正則表達式(Perl Regular Expression 又叫 Perl RegEx 簡稱 PREs)
b. 處理過程:查找文本文件中是否包含要查找的 「關鍵字」(關鍵字可以是正則表達式) ,默認返回匹配的該行的內容
c. grep|egrep處理文件時,按行處理 |
| sed | sed | sed -r | - | a. 處理對象:文本文件
b.處理操作:對文本文件的內容進行 查找、替換、刪除、增加等操作
c. sed 在處理文本文件的時候,按行處理 |
| awk | - | awk | - | a. awk 處理的對象:文本文件
b. awk 處理操作:主要是對列進行操作 |
注意:egrep 或 sed -r 默認使用擴展正則表達式(EREs),一般特殊字元({})可以不轉義
grep -E 以及egrep(Extend Regular Expression)
Linux通配符和三劍客的正則表達式是不一樣的,因此,代表的意義也有較大的區別 。
通配符一般用戶命令行bash環境,而linux正則表達式用於grep, sed, awk場景。
通配符說明
示例:* 的使用:代表任意0-N個字元,代表所有字元
7. Linux三劍客之grep
說起Linux操作系統中的 grep 命令,或許沒有人會不知道。在我看來, grep 命令是Linux操作系統上最強大的工具之一,正如你無時無刻不在使用它。無論是從文件中找到匹配的行,又或者是從終端輸出中獲取指定信息,都離不開對 grep 的使用。
了解一個工具的使用,還是先看這個工具的man手冊會告訴我們什麼。
手冊中提到, grep 工具還有兩個孿生兄弟,分別是 egrep 和 fgrep 。其中, egrep 相當於 grep -E 的用法,使用的是擴展形式的正則表達式; fgrep 相當於 grep -F 的用法,根據固定模式進行內容匹配。
對於任何的Linux操作系統,你可以很輕松的找到 /etc/passwd 文件,以下的多數演示將會以該文件進行演示。以下為用戶的部分信息
grep 命令的格式相對比較簡單。完整的命令格式如 grep [OPTIONS] PATTERN [FILE...] ,其中 [OPTIONS] 選項提供了眾多的參數,如下
如果需要找到包含 root 用戶和 adm 用戶的行,可以通過 grep -E "root|adm" /etc/passwd 來查找所有滿足的行
了解 grep 的常用參數可以在工作中解決絕大部份的問題,但在一些情況下,需要對過濾出的內容按照某種規則進行精確匹配,還需要配合正則使用。以下介紹了幾種常用的正則語法
8. 4-18 Linux中搜索文件的內容 --- grep
1、grep:用於查找文件里符合條件的字元串(內容)。豐富的參數用於對搜索過程的補充。命令模式十分靈活,可以是變數、字元串、正則表達式。
2、linux 支持 grep、egrep 和 fgrep。grep 和 egrep 都支持正則表達式,只不過 egrep 支持的是擴展正則表達式。fgrep 不支持正則表達式,只支持普通字元串的過濾。
3、grep 加上相應的參數可以實現 egrep 和 fgrep 的功能。所以,也可以用 grep 加上對應的參數來執行 egrep 和 fgrep。
4、通過 man grep 查看說明。
5、grep 命令的基本操作:
②、grep 根據條件過濾文件內容。
三、grep 命令的常用參數。
①、--color=auto:對匹配的字元串用高光顯示。
②、-v:排除過濾條件的行,也就是顯示排除條件以外的內容。
③、-i:忽略大小寫。
④、-n:顯示匹配的行號,列出內容的同時也列出行號。
⑤、-c:統計匹配的行數,只列出共多少行符合過略條件,不列出內容。
⑥、-o:僅顯示匹配的字元串,只顯示文本中含過濾條件的字元串。
⑦、-q:靜默模式,不輸出任何信息。用於返回值判斷,不考慮輸出內容。
⑧、-A:(after),顯示包含當前字元串的後多少行。
⑨、-B:(before),顯示包含當前字元串的前多少行。
⑩、-C:(context),顯示包含當前字元串的前後多少行。
⑩-①、-e:or,或。用於多個參數間的邏輯 或 判斷。
⑩-②、-w:精確匹配,匹配整個單詞。
⑩-③、-f:把過濾條件放到文件中,通過讀取文件的過濾條件進行過濾。
⑩-④、-E:使用 egrep。(支持擴展正則表達式)
⑩-⑤、-F:使用 fgrep(不支持正則表達式)。
②、-v:排除過濾條件的行,也就是顯示排除條件以外的內容。
③、-i:忽略大小寫。
④、-n:顯示匹配的行號,列出內容的同時也列出行號。
⑤、-c:統計匹配的行數,只列出共多少行符合過略條件,不列出內容。
⑥、-o:僅顯示匹配的字元串,只顯示文本中含過濾條件的字元串。
⑦、-q:靜默模式,文本中包不包含過濾條件的字元串都不輸出任何信息。用於返回值判斷,命令執行成功返回 0,失敗返回非 0。
⑧、-A:(after),顯示包含當前字元串的後多少行。
⑨、-B:(before),顯示包含當前字元串的前多少行。
⑩、-C:(context),顯示包含當前字元串的前後多少行。
⑩-①、-e:or,或。用於多個參數間的邏輯 或 判斷。
⑩-②、-w:精確匹配,匹配整個單詞。
⑩-③、-f:把過濾條件放到文件中,通過讀取文件的過濾條件進行過濾。