文件權限管理&正則表達式
文件權限管理
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]