文本處理三劍客之 grep

来源:http://www.cnblogs.com/Q--T/archive/2017/11/27/7901409.html
-Advertisement-
Play Games

grep 簡介 grep(Global search REgular expression and Print out the line)是Linux上的文本處理三劍客之一,另外兩個是sed和awk. grep是文本搜索工具,根據用戶指定的pattern(由文本字元及正則表達式元字元編寫的過濾條件) ...


grep簡介

  grep(Global search REgular expression and Print out the line)是Linux上的文本處理三劍客之一,另外兩個是sed和awk.

  grep是文本搜索工具,根據用戶指定的pattern(由文本字元及正則表達式元字元編寫的過濾條件)對目標文本逐行進行匹配檢查並列印出符合條件的行.

  grep有三個版本:grep,egrep和fgrep. egrep是擴展的grep,等同於grep -E,fgrep是快速grep,不支持正則表達式.

之前覺得glob跟grep正則很相似,其實他們的區別還挺大:

  glob匹配文件名,grep匹配文件內容

  glob是全部匹配,grep是部分匹配

正則表達式(Regular Expression,在代碼中常簡寫為regex、regexp或RE):

  正則表達式是對字元串(包括普通字元(例如,a 到 z 之間的字母)和特殊字元(稱為“元字元”))操作的一種邏輯公式,就是用事先定義好的一些特定字元、及這些特定字元的組合,組成一個“規則字元串”,這個“規則字元串”用來表達對字元串的一種過濾邏輯。正則表達式是一種文本模式,模式描述在搜索文本時要匹配的一個或多個字元串。

不同版本的grep對正則表達式的支持有所不同:

  grep:預設是使用基本正則表達式(BRE)

  egrep:支持擴展的正則表達式(ERE)

  fgrep:不支持正則表達式(但搜索速度快)

grep命令:

  命令格式:

    grep [OPTIONS] PATTERN [FILE...]

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

  常用選項:

    --color=auto:對匹配到的文本著色高亮顯示

    -i:忽略字元大小寫

    -o:僅顯示匹配到的文本自身(預設顯示匹配到的文本整行)

    -v,--invert-match:顯示不能被pattern匹配到的行

    -E,--extened-regexp:支持擴展的正則表達式(ERE).相當於egrep命令

    -F,--fixed-strings:相當於fgrep命令

    -q,--quiet,--silent:靜默模式,不輸出任何信息,取命令退出狀態碼時常用

    -G,--basic-regexp:支持使用基本正則表達式

    -P,--perl-regexp:支持使用pcre正則表達式(支持元字元很多)

    -e PATTERN,--regexp=PATTERN:使用多模式

    -f FILE,--file=:FILE為每行包含了一個pattern的文本文件,即grep script,把模式寫在一個文件里,通過讀取文件(腳本文件),來匹配

    -c:顯示統計匹配到的行數

    -r,--recursive:對目錄下所有文件里的內容根據模式匹配

    -A #,--after-context=#:表示顯示匹配到行的後面#行

    -B #,--before-context=#:表示顯示匹配到行的前面#行

    -C #,-#,--context=#:表示顯示匹配到行的前後#行

  示例:

    # grep 'root' /etc/passwd:如果模式里有變數要用雙引號

    clip_image001

    # grep -v 'root' /etc/passwd:反向匹配,顯示所有沒有被匹配的行

    clip_image002

    # grep -i 'bash' bash.txt:忽略字元大小寫

    clip_image003

    # grep -o 'root' /etc/passwd:僅顯示匹配到的文本自身

    clip_image004

    # grep -q 'root' /etc/passwd:靜默模式

    clip_image005

  示例

    # grep -e "r..t" -e "bash" /etc/passwd:使用多模式

    clip_image006

    # grep -f /root/test/mypat /etc/passwd:使用保存在文件里的匹配模式,模式無需加引號.

    clip_image007

    # grep -A 1 "^[op]" /etc/passwd:顯示匹配到的行後面的一行

    clip_image008

    # grep -B 2 "^[op]" /etc/passwd:顯示匹配到的行前面的兩行

    clip_image009

    # grep -C 1 "^[op]" /etc/passwd:顯示匹配到的行前後各一行

    clip_image010

基本正則表達式元字元:

  1、字元匹配:

    .:匹配任意單個字元

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

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

    [:digit:]:任意單個數字

    [:lower:]:任意單個小寫字母

    [:upper:]:任意單個大寫字元

    [:alpha:]:任意單個字母

    [:alnum:]:任意單個字母和數字

    [:space:]:任意單個空白字元

    [:blank:]:任意單個空格和tab

    [:punct:]:任意單個標點符號

    [:cntrl:]:任意單個控制符

    [:graph:]:任意單個能顯示的符號

    [:print:]:任意單個可列印符號

    [:xdigit:]:任意單個十六進位字元

  示例

    # ifconfig | grep "r..":r後跟兩個字元的行

    clip_image011

    # ifconfig | grep -i "i[a-z][a-z]":不區分大小寫,i後跟兩個字母的行

    clip_image012

    # ifconfig | grep "i[[:alpha:]][[:space:]]":i後跟一個字母再跟一個空格的行

    clip_image013

  2、次數匹配:

    用在要指定其出現的次數的字元後面,用於限制其前面的字元要出現的次數,預設工作在貪婪模式

    *:匹配前面的字元出現的任意次(0,1或多次)

    grep "x*y":只要有y就匹配

    clip_image014

    .*:匹配任意長度的任意字元,相當於glob中的*

    grep "x.*y":在x和y之間可出現任意長度任意字元即匹配

    clip_image015

    \+:匹配前面的字元至少1次(1次或多次);\為轉義符

    grep "x\+y":y之前必須出現一個x

    clip_image016

    \?:匹配前面的字元0次或1次,即前面的字元可有可無

    grep "x\?y":只要有y就匹配

    clip_image017

    \{m\}:匹配其前面的字元出現m次,m為非負整數

    grep "x\{2\}y":y前出現2次x就匹配

    clip_image018

    \{m,n\}:匹配其前面的字元出現m次,m為非負整數;閉區間[m,n]

    clip_image019

    \{0,n\}:至多n次

    clip_image020

    因為會匹配多次,所以全部都會匹配

    \{m,\}:至少m次

    clip_image021

  示例

    # ifconfig | grep "i[[:alpha:]]\{3\}":匹配i後跟3個字母的行

    clip_image022

    # ifconfig | grep "i[[:alpha:]]\{3,\}":匹配i後跟至少3個字母的行

    clip_image023

  3、位置錨定:

    限制使用模式搜索文本,限制模式所匹配到的文本只能出現於目標文本的哪個位置

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

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

    ^PATTERN$:要讓PATTERN完全匹配一整行

    ^$:匹配空行;

    ^[[:space:]].*$:匹配空白行;

  示例

    # grep "^r..t" /etc/passwd:匹配r開頭後跟兩個字元再跟t的行

    clip_image024

    # grep "l.\{3\}n" /etc/passwd:匹配l後跟3個字元再跟n的行

    clip_image025

    # grep "l.\{3\}n$" /etc/passwd:匹配l後跟3個字元再跟n結尾的行

    clip_image026

    # grep "[[:space:]]\+" /etc/passwd:匹配至少連續出現一個空格的行

    clip_image027

  單詞:非特殊字元組成的連續字元(字元串)都稱為單詞

    \<或\b:詞首錨定,用於單詞模式的左側,格式為\<PATTERN,/bPATTERN

    \>或\b:詞尾錨定,用於的承諾模式的右側,格式為PATTERN\>,PATTERN\b

  示例

    # grep "\<r..t" /etc/passwd:匹配單詞詞首:r後跟兩個字元再跟t的行

    clip_image028

    # grep "\<r..t\>" /etc/passwd:匹配單詞:r後跟兩個字元再跟t的行

    clip_image029

    # ifconfig | grep "\<[0-9]\{3\}\>":匹配單詞:三個數字

    clip_image030

  更多實例:

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

    # grep -v 'bash$' /etc/passwd

    clip_image031

    2、找出/etc/passwd文件中的三位或四位數

    # grep '\<[0-9]\{3,4\}\>' /etc/passwd

    clip_image032

    3、找出/etc/grub2.cfg文件中,以至少一個空白字元開頭,後面又跟了一非空白字元的行

    # grep '^[[:space:]]\+[^[:space:]]' /etc/grub2.cfg

    clip_image033

    4、找出"netstat -tan"命令的結果中,以‘LISTEN’後跟0或多個空白字元結尾的行

    # netstat -tan | grep 'LISTEN[[:space:]]*$'

    clip_image034

    5、找出“fdisk -l”命令結果中,以/dev/後跟sd或hd及一個小寫字母的行

    # fdisk -l | grep '/dev/[sh]d[a-z]\>'

    clip_image035

    6、找出“ldd /usr/bin/cat”命令的結果中的文件路徑

    # ldd /usr/bin/cat | grep -o '/[^[:space:]]\+'

    clip_image036

  4、分組與引用:

    \(PATTERN\):將此PATTERN匹配到的字元當作一個不可分割的整體進行處理

    註意:分組括弧中的模式匹配到的字元會被正則表達式引擎自動記錄於內部變數中,這些變數是\1,\2,\3,...

    例如:pat1\(pat2\)pat3\(pat4\(pat5)pat6\)

    \n:模式中的第n個左括弧以及與之匹配的右括弧之間的模式所匹配到的字元串(不是模式,而是模式匹配的結果)

    \1:表示第一組括弧總的PATTERN匹配到的的字元串;上例:pat2

    \2:表示第二組括弧總的PATTERN匹配到的的字元串;上例:pat4\(pat5)pat6

    \3:表示第三組括弧總的PATTERN匹配到的的字元串;上例:pat5

    ...

    示例,文檔test內容如下:

    he love his lover

    he like his lover

    he love his liker

    he like his liker

    .*l..e.*l..er

    \(l..e\).*\1r

    # grep -o 'l..e.*l..er' test:不能完成精確匹配

    clip_image037

    # grep -o '\(l..e\).*\1r' test:分組可完成精確匹配

    clip_image038

    後向引用:引用前面的括弧中的模式所匹配到的字元串

egrep命令:

    命令格式

      egrep [OPTIONS] PATTERN [FILE...]

    命令選項:

      egrep的選項與grep相同

    擴展正則表達式的元字元:無需轉義符

    字元匹配:

      .:匹配任意單個字元

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

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

      [:digit:]:任意單個數字

      [:lower:]:任意單個小寫字母

      [:upper:]:任意單個大寫字元

      [:alpha:]:任意單個字母

      [:alnum:]:任意單個字母和數字

      [:space:]:任意單個空格

      [:blank:]:任意單個空格和tab

      [:punct:]:任意單個標點符號

    次數匹配:

      *:匹配前面的字元(可有可無)出現的任意次(0,1或多次)

      ?:匹配前面的字元0次或1次,即前面的字元可有可無

      +:匹配前面的字元至少1次(1次或多次)

      {m}:匹配其前面的字元出現m次,m為非負整數

      {m,n}:匹配其前面的字元出現m次,m為非負整數

      {0,n}:至多n次

      {m,}:至少m次

    位置錨定:

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

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

      ^PATTERN$:要讓PATTERN完全匹配一整行

      ^$:匹配空行

      \<,\b:詞首錨定,用於單詞模式的左側,格式為\<PATTERN,/bPATTERN

      \>,\b:詞尾錨定,用於的承諾模式的右側,格式為PATTERN\>,PATTERN\b

    分組及引用:

      (pattern):分組,括弧中的模式匹配到的字元會被存儲於正則表達式引擎內部的變數中

      後向引用:\1,\2,\3,...

    或者:

      a|b:a或者b

      C|cat:表示C或cat

      (C|c)at:表示Cat或cat

  egrep實例:

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

      # egrep -v 'bash$' /etc/passwd

      clip_image039

      2、找出/etc/passwd文件中的三位或四位數

      # egrep '\<[0-9]{3,4}\>' /etc/passwd

      clip_image040

      3、找出/etc/grub2.cfg文件中,以至少一個空白字元開頭,後面又跟了一非空白字元的行

      # egrep '^[[:space:]]+[^[:space:]]' /etc/grub2.cfg

      clip_image041

      4、找出"netstat -tan"命令的結果中,以‘LISTEN’後跟0或多個空白字元結尾的行

      # netstat -tan | egrep 'LISTEN[[:space:]]*$'

      clip_image042

      5、找出“fdisk -l”命令結果中,以/dev/後跟sd或hd及一個小寫字母的行

      # fdisk -l | egrep '/dev/[sh]d[a-z]\>'

      # fdisk -l | egrep '/dev/(s|h)d[a-z]\>'

      clip_image043

      6、找出“ldd /usr/bin/cat”命令的結果中的文件路徑

      # ldd /usr/bin/cat | egrep -o '/[^[:space:]]+'

      clip_image044

      7、找出/proc/meninfo文件中,所有以大寫或小寫s開頭的行,至少用三種方式實現

      # egrep "^(s|S)" /proc/meminfo

      # grep "^[sS]" /proc/meminfo

      # grep -i "^s" /proc/meminfo

      clip_image045

      8、顯示當前系統上root,centos,或slackware用戶的相關信息

      # egrep "^(root|centos|slackware)\>" /etc/passwd

      # egrep "^(root|centos|slackware):" /etc/passwd

      clip_image046

      9、echo輸出一個絕對路徑,使用grep取出基名

      # echo /etc/passwd/ | egrep -o "[^/]+/?$"

      clip_image047

      10、找出ifconfig命令結果中的1-255之間的整數

      # ifconfig| egrep "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"

      clip_image048

      11、添加用戶bash、testbash、及nologin,要求前三個用戶的預設shell為/bin/bash,而後找出其用戶名與shell相同的用戶

      # egrep "^([a-z0-9]+)\>.*\1$" /etc/passwd

      clip_image049


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

-Advertisement-
Play Games
更多相關文章
  • 1.資料庫表操作: - 首先啟動mysql伺服器,在安裝mysql的目錄下打開cmd視窗,運行mysql:'mysql.exe -hlocalhost -p3306 -uroot -p123456'; - 查看所有的資料庫: show databases; -- create database my ...
  • 同義詞: 對另一個數據對象而言同義詞是一個別名,同義詞對其目標對象進行依賴,如果目標對象被更改或刪除,則該同義詞將變為無效。 同義詞不能代替資料庫對象的特權,即先用對模式的對象有查詢、執行、刪除等許可權。 許可權: 要在自己的模式中創建私有同義詞,您必須具有CREATE SYNONYM系統特權。 要在另 ...
  • 這個系列大致想跟大家分享以下篇章(我會持續更新的↖(^ω^)↗): 1、mongo 3.4分片集群系列之一:淺談分片集群 2、mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3、mongo 3.4分片集群系列之三:搭建分片集群--哈希分片 + 安全 4、mongo 3.4分片集群系列之 ...
  • 什麼是資料庫系統? 資料庫系統=資料庫(DataBase(DB))+資料庫管理系統(Database Management System (DBMS))+資料庫應用程式(Database Application (DBA)) 資料庫:為了滿足一個機構的信息需求而設計的邏輯上相關的可共用的數據及數據描 ...
  • 最近有個需求,需要整合所有店鋪的數據做一個離線式分析系統,曾經都是按照店鋪分庫分表來給各自商家通過highchart多維度展示自家的店鋪經營 狀況,我們知道這是一個以店鋪為維度的切分,非常適合目前的線上業務,這回老闆提需求了,曾經也是一位數據分析師,sql自然就溜溜的,所以就來了 一個以買家維度展示 ...
  • 給大家介紹一下虛擬機和Xshell5連接的基本配置1.安裝虛擬機,跟著提示一步一步安裝即可,註意添加鏡像文件,虛擬機就完成了.2.下載一個Xshell5,安裝好之後.要修改虛擬機的網卡狀態 1).編輯ifcfg-eth0, 2).點一下i,出現--inner--,修改ONBOOT=YES,Esc退出 ...
  • 1.創建mysql用戶,mysql組. # useradd -s /bin/nologin -M mysql 查看是否創建成功. # id mysql 2.講mysql的二進位包解壓到/usr/local/目錄下. # cd /usr/local/ # tar -zxvf mysql-5.7.20- ...
  • Mysql的許可權 mysql中存在4個控制許可權的表,分別為user表,db表,tables_priv表,columns_priv表。 mysql許可權表的驗證過程為: 先從user表中的Host,User,Password這3個欄位中判斷連接的ip、用戶名、密碼是否存在,存在則通過驗證。 通過身份認證 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...