Linux学习十七、正规表达式练习题
生活随笔
收集整理的這篇文章主要介紹了
Linux学习十七、正规表达式练习题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
- 情境模擬題一:透過 grep 搜尋特殊字串,并配合數據流重導向來處理大量的文件搜尋問題。
- 目標:正確的使用正規表示法;
- 前提:需要了解數據流重導向,以及透過子命令 $(command) 來處理檔名的搜尋;
我們簡單的以搜尋星號 (*) 來處理底下的任務: - 利用正規表示法找出系統中含有某些特殊關鍵字的文件,舉例來說,找出在 /etc 底下含有星號 (*) 的文件與內容:
解決的方法必須要搭配萬用字節,但是星號本身就是正規表示法的字符,因此需要如此進行:
你必須要注意的是,在單引號內的星號是正規表示法的字符,但我們要找的是星號,因此需要加上跳脫字符 (\)。但是在 /etc/* 的那個 * 則是 bash 的萬用字節! 代表的是文件的檔名喔!不過由上述的這個結果中,我們僅能找到 /etc 底下第一層子目錄的數據,無法找到次目錄的數據, 如果想要連同完整的 /etc 次目錄數據,就得要這樣做:[root@www ~]# grep '\*' /etc/* [root@www ~]# grep '\*' $(find /etc -type f) - 但如果文件數量太多呢?如同上述的案例,如果要找的是全系統 (/) 呢?你可以這樣做:
真要命!由於命令列的內容長度是有限制的,因此當搜尋的對象是整個系統時,上述的命令會發生錯誤。那該如何是好? 此時我們可以透過管線命令以及 xargs 來處理。舉例來說,讓 grep 每次僅能處理 10 個檔名,此時你可以這樣想:[root@www ~]# grep '\*' $(find / -type f) -bash: /bin/grep: Argument list too long - 先用 find 去找出文件;
- 用 xargs 將這些文件每次丟 10 個給 grep 來作為參數處理;
- grep 實際開始搜尋文件內容。
- 從輸出的結果來看,數據量實在非常龐大!那如果我只是想要知道檔名而已呢?你可以透過 grep 的功能來找到如下的參數!
[root@www ~]# find / -type f | xargs -n 10 grep -l '\*' - 情境模擬題二:使用管線命令配合正規表示法創建新命令與新變量。我想要創建一個新的命令名為 myip , 這個命令能夠將我系統的 IP 捉出來顯示。而我想要有個新變量,變量名為 MYIP ,這個變量可以記錄我的 IP 。
處理的方式很簡單,我們可以這樣試看看: - 首先,我們依據本章內的 ifconfig, sed 與 awk 來取得我們的 IP ,命令為:
[root@www ~]# ifconfig eth0 | grep 'inet addr' | \ > sed 's/^.*inet addr://g'| cut -d ' ' -f1 - 再來,我們可以將此命令利用 alias 指定為 myip 喔!如下所示:
[root@www ~]# alias myip="ifconfig eth0 | grep 'inet addr' | \ > sed 's/^.*inet addr://g'| cut -d ' ' -f1 " - 最終,我們可以透過變量配置來處理 MYIP 喔!
[root@www ~]# MYIP=$( myip ) - 如果每次登陸都要生效,可以將 alias 與 MYIP 的配置那兩行,寫入你的 ~/.bashrc 即可!
所以整個作法就會變成這樣:
| [root@www ~]# find / -type f | xargs -n 10 grep '\*' |
簡答題部分:
- 我想要知道,在 /etc 底下,只要含有 XYZ 三個字節的任何一個字節的那一行就列出來,要怎樣進行? grep [XYZ] /etc/*
- 將 /etc/termcap 內容取出后,(1)去除開頭為 # 的行 (2)去除空白行 (3)取出開頭為英文字母的那幾行 (4)最終統計總行數該如何進行? grep -v '^#' /etc/termcap | grep -v '^$' | grep '^[[:alpha:]]' | wc -l
- 或
-
grep?-v?'^[#$]'?/etc/termcap?|?grep?'^[a-zA-Z]'?|?wc?-l
總結
以上是生活随笔為你收集整理的Linux学习十七、正规表达式练习题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【SICP练习】22 练习1.28
- 下一篇: CSS 实现按钮及线呼吸灯效果