文本處理三劍客之 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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...