linux基礎三劍客之grep

来源:https://www.cnblogs.com/lanxiansen/archive/2019/03/06/10484947.html
-Advertisement-
Play Games

linux基礎三劍客之grep 1、grep命令 基本介紹 grep命令是文本本過濾工具,是基於一個模式匹配文件的每一行,grep分類:egrep個fgrep。 grep英文名:Global search Regular expression and Print out the line grep命 ...


    

linux基礎三劍客之grep

1、grep命令

基本介紹

  grep命令是文本本過濾工具,是基於一個模式匹配文件的每一行,grep分類:egrepfgrep

  grep英文名:Global  search  Regular  expression  and  Print  out  the  line

  grep命令的作用:文本所搜工具。根據用戶指定的模式對目標文件逐行進行匹配檢查,並且列印匹配的行

  模式:由正則表達式字元串及文本字元所編寫的過濾條件

  正則表達式:英文名regular  expression,解釋:由一類特殊字元及文本字元所編寫的模式,其中有些字元不表示字元字面意義,而表示控制或者通配的功能

  正則表達式分類

    基本正則表達式:basic  regular  expression,簡寫BRE

    擴展正則表達式:extend regular  expression,簡寫ERE

    註意:grep預設支持的是基本正則表達式,但是grep命令可以是用選項-E來使用擴展正則表達式。egrep命令預設支持擴展正則表達式

  正則表達式引擎:檢查一個模式是否匹配一段文本信息的程式,不同的編程語言使用的正則表達式引擎可能不同。引擎不同,檢查字元匹配的演算法不同。

  grep命令內部自帶了正則表達式引擎來實現文本的檢查

  基本語法

     grep [OPTIONS] PATTERN [FILE...]

     grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

      常用選項

        --color-auto:對匹配的文本內容進行著色

        -v:顯示不能夠被pattern匹配的行

        -i:忽略字元大小寫

        -o:僅顯示匹配到的字元串

        -q:對匹配或者不匹配的內容不輸出任何信息,表示是靜默模式

        -A  num:顯示匹配到的行及在這之後多顯示num

        -B  num:顯示匹配到的行及在這之前多顯示num

        -C  num:顯示匹配到的行及在這之前和之後顯示num

        -E:使用擴展正則表達式

        -F:使用固定字元正則表達式

        -G:表示使用基本正則表達式

        -P:表示使用perl正則表達式

  基本正則表達式的元字元

    字元匹配元字元

      .:匹配任意單個字元

      []:匹配指定範圍內的任意單個字元

      [^]:匹配範圍之外的任意單個字元

      也支持字元集範圍表示

      [:digit:][:alnum:][:alpha:][:lower:][:upper:][:punct:]

        使用案例

[root@oldboy ~]# grep "^[[:alpha:]].[[:alpha:]]$" a.txt

hal

kde

lvm

ntp

opt

pki

ppp

rpc

rpm

ssh

ssl

xdg

xml

yum

qwe

    匹配次數元字元

      基本介紹

        用在要指定次數的字元後邊,用於指定前面的字元要出現的次數

    匹配次數元字元

      *:匹配前面的字元0次或者多次

      使用案例

[root@oldboy ~]# grep "x*y" grep.txt
xay
xbby 

      \?:匹配前面的字元0次或者1

.      *:匹配任意長度字元

      \+:匹配前面字元至少一次

      \{m\}:匹配前面的字元m次。

      \{m,n\}:匹配掐面字元至少m次,至多n

        \{m,\}:匹配前面字元至少m次,多則不限

        \{0,n\}:匹配前面的字元至多n

 

        使用註意

          為什麼要使用\?-----因為?問號、加號+、大括弧{}linuxbash解釋器中有特殊意義,用反斜線在意就讓他表示?問號原來的意義,即?問號在bash中表示任意字元,{}大括弧在bash中表示內容展開,因此為了避免在bash中被解釋,那麼使用反斜線轉義

    位置錨定元字元

      基本介紹

        要求指定的字元串模式必須出現在特定位置,那麼得使用位置錨定元字元

      位置錨定元字元有

        ^:行首錨定,用於模式的最左側

        $:行尾錨定,用於模式的最右側

        ^PATTERN$:用於模式匹配整行

        ^$:匹配空行

          ^[[:space:]]*$:匹配整行為空格行或者空行

        \<或者\b:單詞的詞首錨定,用於單詞模式的左側

        \>或者\b:單詞的詞尾錨定,用於單詞模式的右側

        \<PATTERN\>:單詞錨定,用於匹配整個單詞

    分組

      \(\):用於將一個後者多個字元串捆綁在一起,當做一個整體進行處理,小括弧在bash中也表示特殊符號

      後項引用:引用前面的分組括弧中的模式所有匹配的字元(並不是引用匹配的模式,而是引用的匹配模式下的字元串)

      案例演示:

[root@oldboy ~]# grep "\(\<[[:alpha:]]\{1,3\}t\>\).*\1" /etc/passwd

root:x:0:0:root:/root:/bin/bash

halt:x:7:0:halt:/sbin:/sbin/halt
View Code

      使用註意:

        分組括弧中的模式匹配到的內容會被正則表達式引擎記錄於內部的變數中,這些變數的命名方式為:\1\2\3...

        \1:表示第一次被分組小括弧所匹配的內容

        \2:表示第二次被分組小括弧所匹配的內容

        .....

        舉例:

          \(ab\+\(xy\{2,\}\))*

            \1匹配上面的:ab\+\(xy\)

            \2匹配上面的:xy\{2,\}

        使用註意

          grep命令預設使用的是貪婪模式匹配,即最大匹配。

      為什麼要使用位置錨定符?

        grep正則匹配預設是每一行按照正則模式一個字元一個字元的匹配,那麼有匹配的字元串可能出現在一行內容的任意位置,因此,如果我們有需求要匹配的字元串在指定的位置(比如:在行首、行尾、詞首、詞尾),那麼就得使用位置錨定元字元

      單詞:在linux正則表達式中表示由特殊符號分割的一個字元串,純數字字元串也算一個單詞(雖然在顯示不算真正意義的單詞)

    案例演示題庫

      顯示/proc/meminfo文件中以大小寫ab開頭的行

[root@oldboy ~]# grep -i "^a" /proc/meminfo

Active:            38640 kB

Active(anon):      19756 kB

Active(file):      18884 kB

AnonPages:         19592 kB

AnonHugePages:         0 kB

[root@oldboy ~]# grep "^[aA].*" /proc/meminfo

Active:            38612 kB

Active(anon):      19720 kB

Active(file):      18892 kB

AnonPages:         19592 kB

AnonHugePages:         0 kB

 
View Code

      顯示/etc/passwd文件中不以/bin/bash結尾的行

[root@oldboy ~]# grep -v  "/bin/bash$"  /etc/passwd 

      顯示/etc/passwd文件中GID最大的用戶名

[root@oldboy ~]# sort -t: -k3 -n  /etc/passwd|tail -n 1

www:x:515:518::/home/www2:/bin/bash

[root@oldboy ~]# sort -t: -k3 -n  /etc/passwd|tail -n 1|cut -d: -f1

www

 
View Code

      顯示/etc/passwdoldboy用戶是否存在,如果存在顯示他的預設shell

[root@oldboy ~]# grep "^\<oldboy\>" /etc/passwd

oldboy:x:500:515:lan:/home/oldboy:/bin/csh

[root@oldboy ~]# grep "^\<root\>" /etc/passwd && grep "^\<root\>" /etc/passwd|cut -d: -f7

root:x:0:0:root:/root:/bin/bash

/bin/bash 
View Code

      顯示/etc/passwd文件中UID是三位數的用戶名

[root@oldboy ~]# grep "\<[[:digit:]]\{3\}\>" /etc/passwd

[root@oldboy ~]# grep "\<[[:digit:]]\{3\}\>" /etc/passwd|cut -d: -f1

 
View Code

      顯示netstat  -tan中出現StateLISTEN的行

[root@oldboy ~]# netstat -tan|grep "LISTEN[[:space:]]*"

tcp     0      0 0.0.0.0:22           0.0.0.0:*                   LISTEN      

tcp        0      0 127.0.0.1:631     0.0.0.0:*                   LISTEN      

tcp        0      0 127.0.0.1:25      0.0.0.0:*                   LISTEN      

tcp        0      0 :::22           :::*                        LISTEN      

tcp        0      0 ::1:631            :::*                      LISTEN      
View Code

      顯示/etc/passwd文件中用戶名與預設shell名相同的行

[root@oldboy ~]# grep "\(\<[[:alnum:]]\+\>\).*\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

bash:x:516:519::/home/bash:/bin/bash
View Code

2、egrep命令

基本介紹

  擴展正則表達式

    egrep = egrep  -E

基本語法

   grep [OPTIONS] PATTERN [FILE...]

  grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

  擴展正則表達式的元字元

    字元匹配

      .:匹配任意一個字元

      []:匹配範圍內的字元

      [^]:匹配範圍外的字元

    次數匹配

      *:匹配0次或者多次

      ?:匹配0次或者1

      +:匹配1次或者多次

      {m}:匹配m

      {m,n}:匹配至少m次,至多n

    錨定字元

      ^:錨定行首

      $:錨定行尾

      \<:錨定詞首

      \>:錨定詞尾

    分組

      ()

      後項引用變數\1\2\3....

    或者

      a|b:支持二選一(擴展正則表達式比基本正則表達式元字元多了二選一)

  練習問題

    顯示當前系統能夠rootcentOS或者oldboy用戶的預設shellUID

[root@oldboy ~]# grep -E "^(root|centos|oldboy)\>" /etc/passwd

root:x:0:0:root:/root:/bin/bash

oldboy:x:500:515:lan:/home/oldboy:/bin/csh
View Code

    找出/etc/rc.d/init.d/functions文件中,某單詞跟一個小括弧的行

[root@oldboy~]#egrep "^\<[_[:alpha:]]+\>[[:space:]]*\(\)" /etc/rc.d/init.d/functions
View Code

    使用echo命令輸出一個命令,使用egrep取出路徑的基名(基名:整個路徑的最後一個文件或者目錄)

[root@oldboy ~]# echo "/etc/fstab" |grep -E -o "[^/]+\/?\>$"

fstab
View Code

    找出ifconfig命令結果中的IP地址

[root@oldboy ~]# ifconfig|grep -E -o "(\<[[:digit:]]+\>\.?){3}\.?[[:digit:]]+"

192.168.173.140

192.168.173.255

255.255.255.0

127.0.0.1

255.0.0.
View Code

找出ifconfig命令結果中的1-255的數值

[root@oldboy ~]# ifconfig | grep -E -o "\<[0-5]+\>"|sort -u -n

00

1

2

3

50

140

255

1000

1500
View Code

   使用註意

     如果是擴展正則表達式,那麼它的匹配模式的擴展正則元字元有一些不用轉義,比如:小括弧,大括弧,加號等,但是錨定詞首和詞尾都需要加轉義字元

3、fgrep命令

基本介紹

  fgrep命令不支持正則表達式搜索,你搜索字元是什麼,就按照你搜索的去匹配

基本語法

  grep  [OPTIONS]  [-f PATTERN]  [FILE...]

基本使用

[root@oldboy ~]# grep -F "a..t" fgrep.txt

a..t

[root@oldboy ~]# grep -F "^h" fgrep.txt

^h
View Code

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 我們在寫腳本或用腳本時,往往會發現 > /dev/null 2>&1 這類的命令。之前都是簡單的瞭解一下,並沒有深度消化,直到自己寫腳本時,不認真寫成了2>&1 >/dev/null,導致結果出問題。下麵我通過網路給大家介紹一下: shell重定向介紹: 我們平時寫的腳本或啟動程式,某段代碼會處理外 ...
  • 今天,要安裝AD域控制器,運行dcpromo結果提示:在該 SKU 上不支持 Active Directory 域服務安裝嚮導。 以前弄的時候直接就通過了,這次咋回事?終於搞了大半天搞定了。 主要原因:我的Windows 2008 R2的版本是WEB版。不支持AD角色,只有DNS和IIS兩個角色,醉 ...
  • RedHat yum源配置 原本以為Redhat7 和Centos7是完全一樣的,可是安裝完Redhat7以後,使用yum安裝軟體,提示紅帽操作系統未註冊。在網上搜索教程,最後成功解決,解決方式是將yum源更改為網易的鏡像庫。 以下為解決方法: 1.首先卸載原來的yum源 參考網上教程,執行: rp ...
  • vim
    轉自:https://www.cnblogs.com/yangjig/p/6014198.html 在命令狀態下對當前行用== (連按=兩次), 或對多行用n==(n是自然數)表示自動縮進從當前行起的下麵n行。你可以試試把代碼縮進任意打亂再用n==排版,相當於一般IDE里的code format。使 ...
  • 要求:寫一個linux bash腳本來查看目標文件夾下所有的file和directory,並且列印出他們的絕對路徑。 運行command:./myDir.sh input_path output_result 要求輸出格式為: 代碼思路: BFS遍歷,數據結構為queue,數組實現。 代碼實現: 寫 ...
  • 如何知道一個文件被哪些進程打開?如何知道當前進程打開了哪些文件?被打開但被刪除的文件能恢復嗎?如何恢復? ...
  • 目錄 基本概念 實踐操作 基本概念 1. Package 程式包,裡面包含節點Node、ROS程式庫、數據集、配置文件 Package Manefist 程式包的配置文件,即描述程式包的相關信息,包括其名字、版本、功能簡述、依賴關係 2. Repositories 代碼倉庫 3. Computati ...
  • Java的工具集相當強大,學習成本也很低,處理線上問題時,jstack這個工具就比微軟的windbg,好學好用很多,3步找出占用CPU很高的源所在。而windbg反人類的各種命令,實在不敢恭維。 故意設置了一個CPU占用很高的場景: 排查問題,步驟: 1. ps -mp 【替換為進程ID PID】 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...