<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      輕松掌握 Linux 文本處理三劍客:grep、awk 和 sed 實(shí)戰(zhàn)演練

       

      Shell 腳本語(yǔ)言編程有哪些優(yōu)勢(shì)呢?

      Shell 腳本語(yǔ)言的優(yōu)勢(shì)在于能夠以最輕量級(jí)最快捷的速度處理 Linux 操作系統(tǒng)偏底層的業(yè)務(wù)。比如軟件的自動(dòng)化安裝、更新版本,監(jiān)控報(bào)警,日志分析等。雖然其他高級(jí)編程語(yǔ)言如 PHP、Python、Ruby 等語(yǔ)言也能做到,但是效率和開(kāi)發(fā)成本上會(huì)大打折扣,所謂“殺雞用牛刀”,有點(diǎn)得不償失。

      成熟的技術(shù)人會(huì)摒棄華而不實(shí)的方法,而會(huì)根據(jù)不同的場(chǎng)景選擇最合適的工具去解決問(wèn)題,樸實(shí)而高效。比如本文著重介紹的 Linux 三劍客:grep、awk 和 sed 就是 Linux 文本處理問(wèn)題的最高效工具。

      下面,我們將依次介紹 Linux 文本處理三劍客的基礎(chǔ)語(yǔ)法,使用場(chǎng)景和特性,以及給出對(duì)應(yīng)的實(shí)戰(zhàn)演練題目。

      Shell 編程環(huán)境安裝

      • Windows 用戶,建議安裝 Git Bash 軟件。
      • Mac 用戶,建議安裝 iterm2 軟件。
      • ssh 工具

      Linux 三劍客介紹

       

       

      • grep:主要用于文本內(nèi)容查找,支持正則表達(dá)式。
      • awk:主要用于文本內(nèi)容的分析處理,也常用于處理數(shù)據(jù),生成報(bào)告,非常適用于需要按列處理的數(shù)據(jù)。(現(xiàn)在很多Linux使用gawk)
      • sed:全稱為 Stream editor ,主要用于文本內(nèi)容的編輯,默認(rèn)只處理模式空間,不改變?cè)瓟?shù)據(jù),而且 sed 使用逐行讀取的方式處理數(shù)據(jù)。

       

       

      grep 常用的參數(shù)如下:
      • -A<行數(shù) x>:除了顯示符合范本樣式的那一列之外,并顯示該行之后的 x 行內(nèi)容。
      • -B<行數(shù) x>:除了顯示符合樣式的那一行之外,并顯示該行之前的 x 行內(nèi)容。
      • -C<行數(shù) x>:除了顯示符合樣式的那一行之外,并顯示該行之前后的 x 行內(nèi)容。
      • -c:統(tǒng)計(jì)匹配的行數(shù)
      • -e :實(shí)現(xiàn)多個(gè)選項(xiàng)間的邏輯or 關(guān)系
      • -E:擴(kuò)展的正則表達(dá)式
      • -f 文件名:從文件獲取 PATTERN 匹配
      • -F :相當(dāng)于fgrep
      • -i --ignore-case #忽略字符大小寫(xiě)的差別。
      • -n:顯示匹配的行號(hào)
      • -o:僅顯示匹配到的字符串
      • -q:靜默模式,不輸出任何信息
      • -s:不顯示錯(cuò)誤信息。
      • -v:顯示不被 pattern 匹配到的行,相當(dāng)于[^] 反向匹配
      • -w :匹配 整個(gè)單詞
      前三個(gè) A、B、C 參數(shù)很容易理解,舉個(gè)栗子,假設(shè)我們有一個(gè)文件,文件名是 test,內(nèi)容是從 1 到 9,每個(gè)數(shù)字一行:

       

      -A2 7 的效果就是找到 7 ,然后輸出 7 后面兩行。
      同理,-B2 7-C2 7就是找到 7 ,然后分別輸出 7 前面兩行和前后兩行:

       

      繼續(xù),假設(shè)我們有個(gè)名叫 test 的文件內(nèi)容如下:

       

      grep -c命令的作用就是輸出匹配到的行數(shù),比如我們想找包含aaa的有幾行,一眼就能看出來(lái)有兩行,第一行和第三行都包含:
      grep -e命令是實(shí)現(xiàn)多個(gè)匹配之間的關(guān)系,比如我們想找包含aaaa或者bbbb的,顯然應(yīng)該返回第一行和第二行:

       

      grep -F相當(dāng)于fgrep命令,就是將pattern視為固定字符串。比如搜索'aa*'不帶-F和帶上,區(qū)別如下:

       

      可以看到第二次就找不到了,因?yàn)樗阉鞯氖?aa*這個(gè)字符串,而不是正則表達(dá)式。grep -f 文件名的使用方法是把后面這個(gè)文件里的內(nèi)容當(dāng)做pattern。比如我們有個(gè)文件,名字是 grep.txt,然后內(nèi)容是aa*,使用方法如下:
      實(shí)際上等同于grep 'aa*' testgrep -i --ignore-case作用是忽略大小寫(xiě)。grep -n顯示匹配的行號(hào),就是多顯示了個(gè)行號(hào),不用細(xì)說(shuō)。grep -o僅顯示匹配到的字符串,還是用剛才的aa*距離,之前顯示的都是匹配到的字符所在的整行,這個(gè)命令是只顯示匹配到的字符:
      grep -q不打印匹配結(jié)果。剛看到這個(gè)我疑惑了半天,讓你搜索字符串,你不給我結(jié)果那有啥用?然后發(fā)現(xiàn)還有一條很多教程沒(méi)說(shuō):如果有匹配的內(nèi)容則立即返回狀態(tài)值 0。所以一般用在shell腳本中,在 if 判斷里面。grep -s不顯示錯(cuò)誤信息,不解釋。grep -v顯示不被匹配到的行,相當(dāng)于[^]反向匹配,最常見(jiàn)的還是用在查找線程的命令里,有時(shí)候會(huì)打印grep線程,可以再加上這么一個(gè)去除自己:
      1. ? ps -ef|grep Typora

      2. 501 91616 1 0 五11上午 ?? 13:39.32 /Applications/Typora.app/Contents/MacOS/Typora

      3. 501 14814 93748 0 5:33下午 ttys002 0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn Typora

      4.  

      5. ? ps -ef|grep Typora|grep -v grep

      6. 501 91616 1 0 五11上午 ?? 13:39.32 /Applications/Typora.app/Contents/MacOS/Typora


      可以看到第二次就沒(méi)有打印grep線程自身grep -w匹配整個(gè)單詞,只有完全符合pattern的單次才會(huì)匹配到:
      可以看到第二次結(jié)果為空,因?yàn)闆](méi)有aaa這個(gè)單詞。

       

       

      grep 實(shí)戰(zhàn)演練題目

      • 找出 nginx.log 中所有 404 和 503 報(bào)錯(cuò)的 log 數(shù)據(jù)

      $grep -E ' 404 | 500 ' nginx.log | wc -l

      $awk '$9~/404|500/' nginx.log | wc -l

       

       

       

      awk
      awk是一個(gè)強(qiáng)大的文本分析工具,相對(duì)于grep的查找,sed的編輯,awk在其對(duì)數(shù)據(jù)分析并生成報(bào)告時(shí),顯得尤為強(qiáng)大。簡(jiǎn)單來(lái)說(shuō)awk就是把文件逐行的讀入,以空格為默認(rèn)分隔符將每行切片,切開(kāi)的部分再進(jìn)行各種分析處理。
      語(yǔ)法

       

      參數(shù)說(shuō)明:
      • -F fs or --field-separator fs 指定輸入文件折分隔符,fs是一個(gè)字符串或者是一個(gè)正則表達(dá)式,如-F:。
      • -v var=value or --asign var=value 賦值一個(gè)用戶定義變量。
      • -f scripfile or --file scriptfile 從腳本文件中讀取awk命令。
      基本用法
      最基本的用法是awk 動(dòng)作 文件名。我們先準(zhǔn)備一個(gè)文件test:

       

      然后輸入awk '{print $1,$4}' test就可以看到:
      對(duì)比可以很清楚的發(fā)現(xiàn),這行語(yǔ)句的作用是打印每行的第一個(gè)和第四個(gè)單詞。這里如果是$0的話就是把整行都輸出出來(lái)。awk- -F命令以指定使用哪個(gè)分隔符,默認(rèn)是空格或者 tab 鍵:
      可以看出只有最后一行有輸出,因?yàn)橛枚禾?hào)做分割,之后最后一行被分成了10 There are orangeapplemongo三項(xiàng),然后我們要的是第二項(xiàng)。
      還可以同時(shí)使用多個(gè)分隔符:

       

      這個(gè)例子便是使用空格和逗號(hào)兩個(gè)分隔符。
      匹配項(xiàng)中可以用正則表達(dá)式,比如:

       

      可以看出都是每行的最后一項(xiàng)。
      其他的內(nèi)置變量還有:
      • FILENAME:當(dāng)前文件名
      • FS:字段分隔符,默認(rèn)是空格和制表符。
      • RS:行分隔符,用于分割每一行,默認(rèn)是換行符。
      • OFS:輸出字段的分隔符,用于打印時(shí)分隔字段,默認(rèn)為空格。
      • ORS:輸出記錄的分隔符,用于打印時(shí)分隔記錄,默認(rèn)為換行符。
      • OFMT:數(shù)字輸出的格式,默認(rèn)為%.6g。
      函數(shù)
      awk還提供了一些內(nèi)置函數(shù),方便對(duì)原始數(shù)據(jù)的處理。主要如下:
      • toupper():字符轉(zhuǎn)為大寫(xiě)。
      • tolower():字符轉(zhuǎn)為小寫(xiě)。
      • length():返回字符串長(zhǎng)度。
      • substr():返回子字符串。
      • sin():正弦。
      • cos():余弦。
      • sqrt():平方根。
      • rand():隨機(jī)數(shù)。
      條件
      awk允許指定輸出條件,只輸出符合條件的行。輸出條件要寫(xiě)在動(dòng)作的前面:

       

       

      sed

      pattern表達(dá)式

      • 20 30,35 行數(shù)與行數(shù)范圍
      • /pattern/ 正則匹配
      • //,// 正則匹配的區(qū)間


      action

      • d 刪除
      • p 打印,通暢結(jié)合-n參數(shù)
      • s/REGEXP/REPLACEMENT/[FLAGS]
      • 替換時(shí)引用 \1 \2 匹配的字段

      sed

      sed 命令的作用是利用腳本來(lái)處理文本文件。使用方法:
      參數(shù)說(shuō)明:
      • -e<script>或--expression=<script> 以選項(xiàng)中指定的 script 來(lái)處理輸入的文本文件,這個(gè)-e可以省略,直接寫(xiě)表達(dá)式。
      • -f<script文件>或--file=<script文件>以選項(xiàng)中指定的 script 文件來(lái)處理輸入的文本文件。
      • -h或--help顯示幫助。
      • -n 或 --quiet 或 --silent 僅顯示 script 處理后的結(jié)果。
      • -V 或 --version 顯示版本信息。
      動(dòng)作說(shuō)明:
      • a:新增, a 的后面可以接字串,而這些字串會(huì)在新的一行出現(xiàn)(目前的下一行)~
      • c:取代, c 的后面可以接字串,這些字串可以取代 n1,n2 之間的行!
      • d:刪除,因?yàn)槭莿h除啊,所以 d 后面通常不接任何咚咚;
      • i:插入, i 的后面可以接字串,而這些字串會(huì)在新的一行出現(xiàn)(目前的上一行);
      • p:打印,亦即將某個(gè)選擇的數(shù)據(jù)印出。通常 p 會(huì)與參數(shù) sed -n 一起運(yùn)行~
      • s:取代,通常這個(gè) s 的動(dòng)作可以搭配正規(guī)表示法,例如 1,20s/old/new/g 。
      我們先準(zhǔn)備一個(gè)文件,名為test做測(cè)試,內(nèi)容如下:

       

      增加內(nèi)容

      使用命令sed -e 3a\newLine testfile這個(gè)命令的意思就是,在第三行后面追加newLine這么一行字符,字符前面要用反斜線作區(qū)分。執(zhí)行完畢之后可以看到結(jié)果:

       

      但是注意,這個(gè)只是將文字處理了,沒(méi)有寫(xiě)入到文件里,文件里還是之前的內(nèi)容。
      其實(shí) a 前面是可以匹配字符串,比如我們只想在出現(xiàn) Linux 的行后面追加,就可以:sed -e /Linux/a\newline test 兩個(gè)斜線之間的內(nèi)容是需要匹配的內(nèi)容。可以看出,只有第二、第四行有Linux,所以結(jié)果如下:

       

      這里用雙引號(hào)把整個(gè)表達(dá)式括起來(lái)也可以,還方便處理帶空格的字符。
      sed -e /Linux/a\newline test等效于sed "/Linux/a newline" test
      插入內(nèi)容
      跟 a 類似,sed 3i\newline test是在第三行前面插入newline:

       

      sed /Linux/i\newline test是在所有匹配到Linux的行前面插入:

       

      可以看出插入的用法和增加很相似。

      刪除

      刪除的字符是d,用法跟前面也很相似,就不贅述,例子如下:

       

      可以看到刪除了匹配到的兩行。

      替換

      替換也是一樣,字符是c。舉個(gè)栗子:

       

      替換還有個(gè)字符是 s,但是用法由不太一樣了,最常見(jiàn)的用法:sed 's/old/new/g'其中old代表想要匹配的字符,new是想要替換的字符,比如:

       

      這里的/g的意思是一行中的每一次匹配,因?yàn)橐恍兄锌赡芷ヅ涞胶芏啻巍N覀兡靡粋€(gè)新的文本文件做例子:

       

      假設(shè)我們想把一行中的第三次及以后出現(xiàn)的a變成大寫(xiě)A,那應(yīng)該這么寫(xiě):
      可以看出只有第一行的有的改了,因?yàn)榈诙谌袥](méi)有這么多a出現(xiàn)。
      關(guān)于s還有很多用法,還是回到第一個(gè)文件,比如可以用/^//$/分別代表行首和行尾:

       

      這個(gè)其實(shí)就是正則表達(dá)式的語(yǔ)法,其他類似語(yǔ)法還有:
      • ^ 表示一行的開(kāi)頭。如:/^#/ 以#開(kāi)頭的匹配。
      • $ 表示一行的結(jié)尾。如:/}$/ 以}結(jié)尾的匹配。
      • \< 表示詞首。如:`\ 表示以 abc 為首的詞。
      • \> 表示詞尾。如:abc\> 表示以 abc 結(jié)尾的詞。
      • . 表示任何單個(gè)字符。
      • * 表示某個(gè)字符出現(xiàn)了0次或多次。
      • [ ] 字符集合。如:[abc] 表示匹配a或b或c,還有 [a-zA-Z] 表示匹配所有的26個(gè)字符。如果其中有^表示反,如 [^a] 表示非a的字符
      以上的所有用法,還可以在字符前面增加行號(hào)或者匹配。什么意思吶?比如你想在第一和第二行后面增加一行內(nèi)容newline,就是:

       

      其他操作同理。不止可以用數(shù)字來(lái)限定范圍,還可以用匹配來(lái)限定,只需要用//括起來(lái):

       

      這里的意思是,從匹配到LINUX的那一行,到匹配到linux的那一行,也就是 123 這三行
      ,都做插入操作。

      多個(gè)匹配

      -e命令可以執(zhí)行多次匹配,相當(dāng)于順序依次執(zhí)行兩個(gè)sed命令:

       

      這個(gè)命令其實(shí)就是先把Linux替換成Windows,再把Windows替換成Mac OS。
      寫(xiě)入文件
      上面介紹的所有文件操作都支持在緩存中處理然后打印到控制臺(tái),實(shí)際上沒(méi)有對(duì)文件修改。想要保存到原文件的話可以用> file或者-i來(lái)保存到文件

       

      posted @ 2024-02-20 11:30  BUGMANWL  閱讀(309)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 日本深夜福利在线观看| 亚洲色大成网站WWW永久麻豆 | 天堂网在线.www天堂在线资源| 国产无遮挡真人免费视频| 无套内谢少妇毛片在线| 日本高清成本人视频一区| 久久中文字幕无码一区二区| 野花韩国高清电影| 国产私拍大尺度在线视频| 国内自拍第一区二区三区 | 亚洲精品日韩在线观看| 中文字幕理伦午夜福利片| 久久久久人妻精品一区三寸| 成人免费无遮挡在线播放| 亚洲中文字幕精品第三区| 熟妇人妻av中文字幕老熟妇| 加勒比中文字幕无码一区| 99热国产成人最新精品| 国产成年女人特黄特色大片免费| 亚洲日产韩国一二三四区| 日本一级午夜福利免费区| 国产乱人偷精品人妻a片| 国产精品毛片在线完整版| 国产精品午夜福利资源| 精品国产一区二区三区国产区| 国产成人午夜福利精品| 国产亚洲精品久久久久久大师| 国产精品SM捆绑调教视频| 欧美一区二区三区在线观看| 国产女人高潮视频在线观看| 在线看无码的免费网站| 国产91色综合久久免费| 国产精品久久国产精品99 gif| 亚洲午夜av一区二区| 小嫩批日出水无码视频免费| 少妇高潮喷水久久久影院| 九九九国产精品成人免费视频| 在线观看成人永久免费网站| japanese边做边乳喷| 精品人妻码一区二区三区| 天天躁夜夜躁狠狠喷水|