8.27(文件權限管理 正則表達式)

文件權限管理&正則表達式

文件權限管理

r讀 4

w寫 2

x執行 1

權限修改命令  chmod

u user    屬主

g group    屬組

o other    其他   

a  all    全部


1、可以使用=來直接指定文件權限

2、可以使用+、來修改文件權限

3、可以使用數字的方法修改權限


擁有着權限修改  chown,chgrp

Chown可以同時對屬主、屬組進行修改,可以替代chgrp


文件遮罩碼  umask

目錄777-umask

文件666-umask(若減得的結果致使文件有執行權限,則權限自動加1)

修改後僅在當前shell進程生效


[root@localhost tmp]# umask 

0022

[root@localhost tmp]# mkdir test

[root@localhost tmp]# touch  a

[root@localhost tmp]# ll

total 4

-rw-r--r-- 1 root root    0 Aug 31 18:07 a

drwxr-xr-x 2 root root 4096 Aug 31 18:07 test

[root@localhost tmp]# umask 0444

[root@localhost tmp]# mkdir testa

[root@localhost tmp]# touch b

[root@localhost tmp]# ll

total 8

-rw-r--r-- 1 root root    0 Aug 31 18:07 a

--w--w--w- 1 root root    0 Aug 31 18:10 b   #重新設置了umask後,新建的文件或者目錄默認權限發生變化,666-444=222,對應的就是w--w--w--

drwxr-xr-x 2 root root 4096 Aug 31 18:07 test

d-wx-wx-wx 2 root root 4096 Aug 31 18:10 testa  #同理,目錄的權限777-444=333,-wx-wx-wx

但是有一種情況:

[root@localhost tmp]# umask 0333

[root@localhost tmp]# touch c

[root@localhost tmp]# mkdir testb

[root@localhost tmp]# ll

total 12

-rw-r--r-- 1 root root    0 Aug 31 18:07 a

--w--w--w- 1 root root    0 Aug 31 18:10 b

-r--r--r-- 1 root root    0 Aug 31 18:13 c  #按理說設置了333,666-333=333應該是-wx-wx-wx的呀,這是因爲如果文件有x權限,則權限自動加1,變成444了

drwxr-xr-x 2 root root 4096 Aug 31 18:07 test

d-wx-wx-wx 2 root root 4096 Aug 31 18:10 testa

dr--r--r-- 2 root root 4096 Aug 31 18:13 testb 目錄是有777-333=444,不受影響,正常計算



基本正則表達式

字符匹配:

.    任意單個字符

[]    中括號中,給出範圍的單個字符

[^]   取反,中括號中範圍之外的單個字符

[:upper:]    大寫字母    A-Z

[:lower:]    小寫字母    a-z

[:alpha:]    大、小寫字母  a-zA-Z

[:digit:]      數字    0-9

[:alnum:]    數字和大、小寫字母    0-9a-zA-Z

[:punct:]    各種標點符號        如'"!?$等

[:space:]    空白字符,包括tab


次數匹配

*    匹配前面字符任意長度

.*    貪婪匹配,匹配任意長度的任意字符

\?    前面字符可有可無,出現0次或者1次

\+    前面字符出現1次或者多次(至少1次)

\{n\}    前面字符出現n次

\{n,m\}    前面字符出現n-m次,至少n次至多m次

\{n,\}      前面字符出現至少n次,多則不限

\{0,m\}      前面字符出現最多m次,少則不限


位置錨定

^ 錨定行首  ^pattern

$  錨定行尾  pattern$

^$   空白行        ^[[:space:]]*$ 空白行,含空白字符、tab

\<    錨定詞首    \<pattern

\>    錨定詞尾    pattern\>

     \<pattern\> 錨定整個單詞    \<[0-9]\{2\}\> 意思是:整個2位數字的單詞(單詞不是指自然語言中的單詞,而是一連串的字符,不含其他符號)


分組&後向引用

\(\)    把括號中的字符串當作一個整體看待


後向引用,是引用前面括號中的字符,而不是模式

\1  引用從左面數第一個"\("和與之對應的"\)"之間模式所匹配到的值

\2  引用從左面數第二個"\("和與之對應的"\)"之間模式所匹配到的值

……    以此類推

如:amb  test  anb   使用: \(a.b\).*\1  則不能匹配,雖然a.b包括amb和anb,但是前面括號中匹配到的值爲amb,所以後面\1引用過來的是amb,而不是a.b這個模式


\  脫意字符

 把一些有特殊含義的符號前加上"\",則把它看作一個普通的字符處理,而失去它原本的特殊含義和作用




擴展正則表達式

字符匹配跟基本正則表達式一樣:

.        任意單個字符

[]        中括號中,給出範圍的單個字符

[^]      取反,中括號中範圍之外的單個字符

[:upper:]        大寫字母       A-Z

[:lower:]        小寫字母       a-z

[:alpha:]        大、小寫字母   a-zA-Z

[:digit:]          數字       0-9

[:alnum:]        數字和大、小寫字母       0-9a-zA-Z

[:punct:]        各種標點符號              如'"!?$等

[:space:]        空白字符,包括tab

 

次數匹配,跟基本正則表達式略有不同,沒有了“\”

*        匹配前面字符任意長度

.*        貪婪匹配,匹配任意長度的任意字符

?        前面字符可有可無,出現0次或者1次

+        前面字符出現1次或者多次(至少1次)

{n}        前面字符出現n次

{n,m}        前面字符出現n-m次,至少n次至多m次

{n,}           前面字符出現至少n次

{0,m}           前面字符出現最多m次

 

位置錨定,跟基本正則表達式一樣

^  錨定行首   ^pattern

$   錨定行尾    pattern$

^$      空白行              ^[[:space:]]*$  空白行,含空白字符、tab

\<       錨定詞首       \<pattern

\>        錨定詞尾       pattern\>

 

分組&後向引用,跟正則表達式略有不同,沒有了"\"

()       把括號中的字符串當作一個整體看待

 

後向引用,是引用前面括號中的字符,而不是模式

\1    引用從左面數第一個“(”和與之對應的“)”之間模式所匹配到的值

\2    引用從左面數第二個“(”和與之對應的“)”之間模式所匹配到的值

……        以此類推

 

\    脫意字符,與基本正則表達式中相同

    把一些有特殊含義的符號前加上“\”,則把它看作一個普通的字符處理,而失去它原本的特殊含義和作用



|   或者,基本正則表達式中沒有的

A|B    A或者B               |整個左側內容或者|右側內容的意思

abc|Cba      是abc或者Cba的意思

ab(c|C)ba    是abcba或者abCba的意思


練習一

1、顯示/etc/passwd文件中以bash結尾的行

                            grep 'bash$' /etc/passwd

2、顯示/etc/passwd文件中的兩位數或三位數;

                            grep '\<[[:digit:]]\{2,3\}\>' /etc/passwd

                            要點:如果不加上\<\>單詞錨定的話,那麼四位數(兩個兩位數)也會匹配到

3、顯示'netstat -tan'命令結果中以‘LISTEN’後跟0個、1個或多個空白字符結尾的行;

                            netstat -tan | grep 'LISTEN[[:space:]]*$'

4、添加用戶bash,testbash,basher以及nologin用戶(nologin用戶的shell爲/sbin/nologin);而後找出/etc/passwd文件中用戶名同shell名的行;

                            grep '^\(\<[[:alnum:]]*\>\).*\1$' /etc/passwd

這個有點複雜,拆開來看:

[[:alnum:]]*  這樣就可以匹配到一串字符,姑且稱爲單詞吧

\<  \>  這樣就能錨定這是一個單詞

\(  \)   這樣把整個單詞看爲一個整體,爲後面的引用做好準備(因爲題目上說用戶名部分和shell是同名的,)

.*   貪婪匹配,

\1$,引用前面\(\)中所匹配到的字符串並且錨定於尾部


[root@localhost tmp]# grep '^\(\<[[:alpha:]]*\>\).*\1$' /etc/passwd

sync:x:5:0:sync:/sbin:/bin/sync

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt

nologin:x:778:778::/home/nologin:/sbin/nologin

bash:x:779:779::/home/bash:/bin/bash



練習二

1、顯示當前系統上root、centos或user1用戶的默認的shell和UID;

                            egrep '^(root|nologin|test)' /etc/passwd |cut -d: -f3,7

使用到了|(或),來找以root或nologin或test開頭的行,然後打印出第3和第7段

2、找出/etc/rc.d/init.d/functions文件中某單詞(單詞中間可以存在下劃線)後面跟着一組小括號的行;

                     egrep '\<[[:alnum:]]+_?[[:alnum:]]+\>\(\)' /etc/rc.d/

3、使用echo輸出一個路徑,而後egrep找出其路徑基名;進一步地:使用egrep取出其目錄名;

基名:    echo /etc/rc.d/init.d/functions/ | egrep '[[:alnum:]]+/?$' -o |cut -d/ -f1

路徑名: 

[root@localhost tmp]# echo /etc/rc.d/init.d/functions | egrep '.*/' -o

/etc/rc.d/init.d/

這麼做有個問題,如果這個路徑的最後面有個"/" 那輸出的結果就不對了

 

4、找出ifconfig命令執行結果中1-255之間的數字;

ifconfig | egrep '\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'

思路:

    1位數|兩位數|三位數

一位數或者兩位數,每位的取值都可以是0-9,但三位數不行,每位都取值0-9,那麼最大可以匹配到999,所以三位數要拆分一下

100-199   1[0-9][0-9]

200-249   2[0-4][0-9]

250-255   25[0-5]


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章