您好,登錄后才能下訂單哦!
本篇內容介紹了“bash的基礎特性”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
一、bash特性 1. 命令歷史: history .bash_history:用戶登出時保存命令歷史的文件(用戶家目錄下的隱藏文件) history #:顯示最近的#條命令; 調用命令歷史列表中的命令 !#:再一次執行歷史列表中的第#條命令; !!:再一次執行上一條命令; !STRING:再一次執行命令歷史列表中最近一個以STRING開頭的命令; 調用上一條命令的最后一個參數: 快捷鍵:ESC, . (ESC松開后再按.) 快捷鍵:Alt+. (按住Alt再按.) 字符串:!$ (直接輸入!$) [root@localhost local]# cat /tmp/script/idsum1.sh ...... [root@localhost local]# vi !$ vi /tmp/script/idsum1.sh
2.補全: 命令補全: 能唯一標識,則直接Tab補全,不能的話,再按一次Tab給出列表; 外部命令根據PATH環境變量中設定的目錄,自左而右逐個搜索目錄下的文件名 路徑補全: 唯一標識Tab補全,不能的話,再按一次Tab給出列表; 3.命令行展開 ~:自動展開為用戶的家目錄,或指定的用戶的家目錄; {}:可承載一個以逗號分隔的路徑列表,并能夠將其展開為多個路徑;
[root@localhost tmp]# ls x_{y,z} x_y: afile1 afile2 x_z: afile3 afile4
4.命令的狀態執行結果 成功: 返回0; 失敗: 1~255; 命令執行完成后,執行狀態保存在bash的特殊變量$?中;
[root@localhost x_z]# useradd yc [root@localhost x_z]# echo $? [root@localhost x_z]# useradd yc useradd: user 'yc' already exists [root@localhost x_z]# echo $? 9
命令正常執行時,有的還會有命令返回值,根據命令及其功能不同,結果各不相同。 引用命令的執行結果:$(COMMAND)或~(COMMAND) 5.引用 強引用:單引號,其中任何內容直接顯示,不做替換。 弱引用:雙引號,其中變量做變量替換,將出現變量的地方替換成變量的值。 命令引用:反單引號,就是引用命令執行結果,$(COMMAND)或~(COMMAND)。
[root@localhost x_z]# name="YC" [root@localhost x_z]# echo '$name' $name [root@localhost x_z]# echo "$name" YC [root@localhost x_z]# mkdir dir_`date +%h-%M-%S` [root@localhost x_z]# ls afiel3 afile4 dir_Jul-48-03
6.快捷鍵 ctrl+a : 跳至命令行首; ctrl+c : 跳至命令行尾; ctrl+u : 刪除從行首到光標; ctrl+k : 刪除從光標到行尾; ctrl+l : clear;
7. 文件通配符 globbing 通配符實際上是一種shell實現的路徑擴展功能,當shell在“參數”中遇到通配符后, 會將其當做路徑或文件名在磁盤上搜尋可能的匹配。 * : 匹配任意長度任意字符; ? : 匹配任意單個字符,如??pa,p?a?; []: 匹配指定范圍內的任意單個字符; 有幾種特殊格式: [a-z];[A-Z];[0-9];[a-z0-9] [[:upper:]] : 所有大寫字母 [[:lower:]] : 所有小寫字母 [[:digit:]] : 所有數字 [[:alpha:]] : 所有字母 [[:alnum:]] : 所有字母和數字 [[:space:]] : 空格字符 [[:punct:]] : 所有標點符號 不記得沒關系,man grep里面有:Their names are self explanatory, and they are [:alnum:], [:alpha:], [:cntrl:], [:digit:], [:graph:], [:lower:], [:print:], [:punct:], [:space:], [:upper:], and [:xdigit:]. For example, [[:alnum:]] means the character class of numbers and letters in the current locale. In the C locale and ASCII character set encoding, this is the same as [0-9A-Za-z] ^[]: 匹配指定范圍外的任意單個字符; [^[:upper:]] [^a-z] 示例:
[root@localhost x_z]# ls *[Ff]ile* ---含File或者file的文件名 afile4 myfile MyFile myfile_002 [root@localhost x_z]# find /tmp/x_z/ -name "*[^[:alpha:]]*" ---含非字母的文件名 /tmp/x_z/ /tmp/x_z/afile4 /tmp/x_z/afiel3 /tmp/x_z/dir_Jul-48-03 /tmp/x_z/1.txt /tmp/x_z/myfile_002 [root@localhost x_z]# find /tmp/x_z/ -name "*[^a-z]*" ---含非小寫字母的文件名 /tmp/x_z/ /tmp/x_z/afile4 /tmp/x_z/afiel3 /tmp/x_z/dir_Jul-48-03 /tmp/x_z/1.txt /tmp/x_z/myfile_002 /tmp/x_z/MyFile
二、正則表達式 由一類特殊字符集文本字符所編寫的模式,其中有些字符不表示其字面意義(要表示要用轉義字符/),而是用于表示控制或者統配的功能。 表達式組成:原義文本字符+元字符 元字符:指那些在正則表達式中具有特殊意義的專用字符,它使正則表達式具有處理能力。 grep:Global search Regular expression and print out the line 文本搜索工具,根據用戶指定的模式(過濾條件)對目標文件逐行進行匹配檢查,打印匹配的行; 正則表達式引擎:元字符及規則因引擎的不同略有不同。 grep [OPTIONS] PATTERN [FILE...] grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...] OPIONTS: -i : 不區分大小寫(ignore case); -o : 僅顯示匹配到的字符; -v : 顯示不能匹配到的行; -q : 不輸出任何信息(當只需要執行結果狀態時使用) -E : 支持擴展正則表達式 -A #: after 匹配行的后#行 -B #: before匹配行的前#行 -C #: context 匹配行的前后#行 基本正則表達式元字符: 字符匹配 . : 匹配任意單個字符; []: 匹配指定范圍內的任意單個字符; 有幾種特殊格式: [a-z];[A-Z];[0-9];[a-z0-9] [[:upper:]] : 所有大寫字母 [[:lower:]] : 所有小寫字母 [[:digit:]] : 所有數字 [[:alpha:]] : 所有字母 [[:alnum:]] : 所有字母和數字 [[:space:]] : 空格字符 [[:punct:]] : 所有標點符號 man grep里面:Their names are self explanatory, and they are [:alnum:], [:alpha:], [:cntrl:], [:digit:], [:graph:], [:lower:], [:print:], [:punct:], [:space:], [:upper:], and [:xdigit:]. For example, [[:alnum:]] means the character class of numbers and letters in the current locale. In the C locale and ASCII character set encoding, this is the same as [0-9A-Za-z] ^[]: 匹配指定范圍外的任意單個字符; [^[:upper:]] 次數匹配: 指定出現的次數的字符后面,限制前面字符出現的次數,實行貪婪模式 貪婪模式:在整個表達式匹配成功的前提下,盡可能多的匹配; * : 匹配前面字符的任意次,0次,1次或者多次 .* : 匹配前面任意長度的任意字符; \? : 匹配前面字符0次或者1次,即可有可無; \+ : 匹配前面字符1次或者多次,即必存在; \{m\} : 匹配前面字符指定m次; \{m,n\} : 匹配前面字符至少m次,至多n次; \{0,n\} : 匹配前面字符至多n次; \{m,\} : 匹配前面字符至少m次; 位置錨定: ^ : 行首錨定 $ : 行尾錨定; ^PATTEERN$ : 用PATTERN來匹配整行; ^$ : 空白行; ^[[:space:]]*$ : 空行或者包含空白字符的行; 單詞錨定: \<或者\b : 詞首錨定,放在詞的前面; \>或者\b : 詞尾錨定,放在詞的后面; \<PATTEERN\> : 匹配完整單詞PATTERN; 分組及引用 \(\) :將一個或者多個字符捆綁在一起,作為一個整體處理;用括號括起來,表示括號時要用轉義字符; 注意:分組括號中的模式匹配到的內容會被正則表達式引擎自動記錄于內部變量中,這些變量為: \1: 模式從左邊起,第一個左括號以及與之匹配的右括號之間的模式所匹配到的字符; \2: 模式從左邊起,第二個左括號以及與之匹配的右括號之間的模式所匹配到的字符; \3: 后項引用: 引用前面的分組括號中的模式所匹配的字符;
練習:
2. 顯示/etc/passwd文件中不以/bin/bash結尾的行
[root@localhost x_z]# grep -v “/bin/bash$” /etc/passwd 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 ......
3. 找出/etc/passwd中包含二位數字或者三位數字的行
[root@localhost x_z]# grep "\<[[:digit:]]\{2,3\}\>" /etc/passwd mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin ......
4. 顯示/porc/meminfo文件中大寫或者小寫S開頭的行
[root@localhost x_z]# grep "^[Ss]\+*" /proc/meminfo ----錯誤示范,這個*可以是0次,沒有s也行; MemTotal: 3868768 kB MemFree: 2927360 kB .... [root@localhost x_z]# grep "^[Ss]\+" /proc/meminfo SwapCached: 0 kB SwapTotal: 2097148 kB SwapFree: 2097148 kB Shmem: 9368 kB Slab: 149628 kB SReclaimable: 85044 kB SUnreclaim: 64584 kB [root@localhost x_z]# grep -i "^[s]\+" /proc/meminfo SwapCached: 0 kB SwapTotal: 2097148 kB SwapFree: 2097148 kB Shmem: 9368 kB Slab: 149628 kB SReclaimable: 85044 kB SUnreclaim: 64584 kB [root@localhost x_z]# grep -E "^(s|S)+" /proc/meminfo SwapCached: 0 kB SwapTotal: 2097148 kB SwapFree: 2097148 kB Shmem: 9368 kB Slab: 149788 kB SReclaimable: 85028 kB SUnreclaim: 64760 kB
egrep 支持擴展的正則表達式,實現grep文本過濾功能;grep -E -i;-o;-v;-q;-G(基本正則表達式) 支持擴展正則表達式元字符: 字符匹配 . : 匹配任意單個字符; []: 匹配指定范圍內的任意單個字符; ^[]: 匹配指定范圍外的任意單個字符; 次數匹配: 指定出現的次數的字符后面,限制前面字符出現的次數,實行貪婪模式 貪婪模式:在整個表達式匹配成功的前提下,盡可能多的匹配; * : 匹配前面字符的任意次,0次,1次或者多次 .* : 匹配前面任意長度的任意字符; ? : 匹配前面字符0次或者1次,即可有可無; + : 匹配前面字符1次或者多次,即必存在; {m} : 匹配前面字符指定m次; {m,n} : 匹配前面字符至少m次,至多n次; {0,n} : 匹配前面字符至多n次; {m,} : 匹配前面字符至少m次; 位置錨定: ^ : 行首錨定 $ : 行尾錨定; ^PATTEERN$ : 用PATTERN來匹配整行; ^$ : 空白行; ^[[:space:]]*$ : 空行或者包含空白字符的行; 單詞錨定: \<或者\b : 詞首錨定,放在詞的前面; \>或者\b : 詞尾錨定,放在詞的后面; \<PATTEERN\> : 匹配完整單詞PATTERN; 分組及引用 ( ):將一個或者多個字符捆綁在一起,作為一個整體處理;用括號括起來,表示括號時要用轉義字符; 注意:分組括號中的模式匹配到的內容會被正則表達式引擎自動記錄于內部變量中,這些變量為: \1: 模式從左邊起,第一個左括號以及與之匹配的右括號之間的模式所匹配到的字符; \2: 模式從左邊起,第二個左括號以及與之匹配的右括號之間的模式所匹配到的字符; \3: 后項引用: 引用前面的分組括號中的模式所匹配的字符; 或 a|b 如 C|cat 表示C或者cat; (C|c)at 表示Cat或者cat;
練習:
5. 使用echo輸出一個絕對路徑,使用egrep取出路徑名,類似執行dirname /etc/passwd的結果。
[root@localhost pp]# pwd /tmp/x_z/pp [root@localhost pp]# ls YC.sh [root@localhost pp]# dirname /tmp/x_z/pp/YC.sh /tmp/x_z/pp [root@localhost pp]# echo /tmp/x_z/pp/YC.sh | grep -E ".*/\<" ----顯示匹配的行全部 /tmp/x_z/pp/YC.sh [root@localhost pp]# echo /tmp/x_z/pp/YC.sh | grep -E -o ".*/\<" /tmp/x_z/pp/
6. 找出ifconfig的IP地址,要求結果中只顯示IP地址。
[root@localhost pp]# ifconfig | grep -Eo "(\<([0-9]|[0-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>.){3} \<([0-9]|[0-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>" 192.167.1.23 255.255.255.0 192.167.1.255 127.0.0.1 255.0.0.0
fgrep: 不支持正則表達式元字符,任何符號都是字符; 當無需要用到元字符去編寫模式時,使用fgrep會更好。
“bash的基礎特性”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。