【Linux相識相知】文本處理工具之grep\egrep\fgrep及正則表達式

来源:http://www.cnblogs.com/liubinsh/archive/2017/07/23/7225097.html
-Advertisement-
Play Games

常說Linux上有文本處理的三劍客,grep、sed和awk,本文就grep做出詳細的描述,並引出正則表達式。 grep 舉例1:匹配/etc/passwd下有frank的行 舉例2:匹配/etc/passwd下有frank的行,忽略大小寫 舉例3:匹配/etc/passwd下不能被bash匹配的行 ...


常說Linux上有文本處理的三劍客,grep、sed和awk,本文就grep做出詳細的描述,並引出正則表達式。

 

grep

NAME:列印模式匹配的行
SYNOPISIS:
       grep [OPTIONS] PATTERN [FILE...]
       grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
常用選項:
--color=auto:對匹配到的文本著色後進行高亮顯示,預設已被別名alias grep='grep --color=auto'
-i:忽略字元的大小寫
-o:僅顯示匹配到的字元串本身
-v:顯示不能被模式匹配到的行
-E:支持使用擴展的正則表達式
-q:靜默模式,即不輸出任何信息
-A #:顯示被模式匹配的行及其後#行
-B #:顯示被模式匹配的行及其前#行
-C #:顯示被模式匹配的行及其前後各#行

 

舉例1:匹配/etc/passwd下有frank的行

[root@localhost tmp]# grep "frank" /etc/passwd
frank:x:1000:1000:frank:/home/frank:/bin/bash

 

舉例2:匹配/etc/passwd下有frank的行,忽略大小寫

[root@localhost tmp]# grep -i "frank" /etc/passwd
frank:x:1000:1000:frank:/home/frank:/bin/bash
Frank:x:1001:1001::/home/Frank:/bin/bash

 

舉例3:匹配/etc/passwd下不能被bash匹配的行

[root@localhost tmp]# grep -v "bash" /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
......
pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin

 

舉例4:僅僅匹配/etc/passwd下的frank,忽略大小寫

[root@localhost tmp]# grep -oi "frank" /etc/passwd
frank
frank
frank
Frank
Frank

 

舉例5:靜默模式匹配含有frank的行

[root@localhost tmp]# grep -q "frank" /etc/passwd
[root@localhost tmp]# 

 

舉例6:匹配/etc/passwd下含有ftp的行及其後3行

[root@localhost tmp]# grep -A 3 "ftp" /etc/passwd
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin

 

舉例7:匹配/etc/passwd下含有ftp的行及其前3行

[root@localhost tmp]# grep -B 3 "ftp" /etc/passwd
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

 

舉例8:匹配/etc/passwd下含有ftp的行及其前後各2行

[root@localhost tmp]# grep -C 2 "ftp" /etc/passwd
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologin

 

egrep

支持擴展正則表達式實現類似於grep的文本過濾功能,相當於grep -E

NAME:列印模式匹配的行
SYNOPISIS:
        egrep [OPTIONS] PATTERN [FILE...]   
-i:忽略字元的大小寫
-o:僅顯示匹配到的字元串本身
-v:顯示不能被模式匹配到的行
-q:靜默模式,即不輸出任何信息
-A #:顯示被模式匹配的行及其後#行
-B #:顯示被模式匹配的行及其前#行
-C #:顯示被模式匹配的行及其前後各#行
-G:支持基本正則表達式

 

fgrep

fgrep搜索字元串而不是搜索匹配的表達式的模式,所以支持正則表達式,當無需要用到元字元去編寫模式的時候,使用fgrep必能更好更快。

支持-i,-v,-o,-A,-B,-C,-p等選項

 

正則表達式

Regular Expression,正則表達式,由一類特殊字元及文本字元編寫的模式,其中有些不表示其字面的意義,而是用戶控制或通配功能,分為基本正則表達式和擴展正則表達式。

基本正則表達式元字元:

字元匹配

. :匹配任意單個字元;
[]:匹配指定範圍內的任意單個字元;
      特殊匹配:[:digit:] 匹配任意單個數字
                        [:lower:] 匹配任意單個小寫字母
                        [:upper:] 匹配任意單個大寫字母
                        [:alpha:] 匹配任意單個字母
                        [:alnum:] 匹配任意單個字母或數字
                        [:punct:] 匹配任意單個符號
                        [:space:] 匹配單個空格
[^]:匹配指定範圍外的任意單個字元;

 

匹配次數

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

*:匹配其前面的字元任意次數:0,1,多次
      .*:匹配任意長度的任意字元
\?:匹配其前面的字元0次或者1次;
\+:匹配其前面的字元1次或者多次;
\{m\}:匹配其前面的字元m次
\{m,n\}:匹配其前面的字元至少m次,至多n次
        \{m,\}:至少m次

 

位置錨定

^:托字元,行首錨定,用於模式的最左側
$:行尾錨定,用於模式的最右側

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

\<或\b:詞首錨定,用於單詞模式的左側
\>或\b:詞尾錨定,用戶單詞模式的右側
\<PATTERN\>:匹配完整單詞

 

分組及引用

分組:
\(\):將一個或多個字元捆綁在一起,當做一個整體進行處理
後向引用:引用前面的分組括弧中的模式所匹配到的字元
分組括弧中的模式匹配到的內容或被正則表達式引擎自動記錄於內部的變數中:
\1:模式從左側起,第一個左括弧及與之匹配的右括弧之間模式匹配到的內容
\2:模式從左側起,第二個左括弧及與之匹配的右括弧之間模式匹配到的內容
以此類推

 

舉例:

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

[root@localhost tmp]# grep -v "/bin/bash$" /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
......
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin

2.找出/etc/passwd文件中的兩位或三位數字

[root@localhost tmp]# grep "\<[[:digit:]]\{2,3\}\>" /etc/passwd
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
......
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin

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

[root@localhost tmp]# grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg 
  load_env
   set default="${next_entry}"
   set next_entry=
   save_env next_entry
   set boot_once=true
   set default="${saved_entry}"
  menuentry_id_option="--id"
  menuentry_id_option=""
  set saved_entry="${prev_saved_entry}"
  save_env saved_entry
  set prev_saved_entry=
  save_env prev_saved_entry
  set boot_once=true

4.找出"netstat -tan"命令的結果中以LISTEN後跟0,1或多個空白結尾的行

[root@localhost tmp]# netstat -tan | grep  "LISTEN[[:space:]]*$"
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN     
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     
tcp6       0      0 :::111                  :::*                    LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN     
tcp6       0      0 ::1:631                 :::*                    LISTEN     
tcp6       0      0 ::1:25                  :::*                    LISTEN 

 

擴展正則表達式元字元:

字元匹配

. :匹配任意單個字元;
[]:匹配指定範圍內的任意單個字元;
      特殊匹配:[:digit:] 匹配任意單個數字
               [:lower:] 匹配任意單個小寫字母
               [:upper:] 匹配任意單個大寫字母
               [:alpha:] 匹配任意單個字母
               [:alnum:] 匹配任意單個字母或數字
               [:punct:] 匹配任意單個符號
               [:space:] 匹配單個空格
[^]:匹配指定範圍外的任意單個字元;

 

匹配次數

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

*:匹配其前面的字元任意次數:0,1,多次
   .*:匹配任意長度的任意字元
?:匹配其前面的字元0次或者1次;
+:匹配其前面的字元1次或者多次;
{m}:匹配其前面的字元m次
{m,n}:匹配其前面的字元至少m次,至多n次
   {m,}:至少m次

 

位置錨定

^:托字元,行首錨定,用於模式的最左側
$:行尾錨定,用於模式的最右側

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

\<或\b:詞首錨定,用於單詞模式的左側
\>或\b:詞尾錨定,用戶單詞模式的右側
\<PATTERN\>:匹配完整單詞

 

分組及引用

分組:
():將一個或多個字元捆綁在一起,當做一個整體進行處理
後向引用:引用前面的分組括弧中的模式所匹配到的字元
分組括弧中的模式匹配到的內容或被正則表達式引擎自動記錄於內部的變數中:
\1:模式從左側起,第一個左括弧及與之匹配的右括弧之間模式匹配到的內容
\2:模式從左側起,第二個左括弧及與之匹配的右括弧之間模式匹配到的內容
以此類推

 

a|b:a或b
C|cat:C或cat
(C
|c)at:cat或Cat

 

小練習

1、列出當前系統上所有已經登錄的用戶的用戶名,註意:同一個用戶登錄多次,則只顯示一次

who | grep -o  "^\<[[:alpha:]]*" |  uniq
View Code

2、取出最後登錄到當前系統的用戶的相關信息

id `who | tail -1 | grep -o  "^\<[[:alpha:]]*"`
View Code

3.取出當前系統上被用戶當做其預設shell的最多的那個shell

cut -d: -f7 /etc/passwd | uniq -c | sort -n | tail -1 | cut -d' ' -f7
View Code

4.將/etc/passd中的第三個欄位設置最大的後10個用戶的信息全部給為大寫保存至/tmp/maxuser.txt文件中

[root@localhost ~]# sort -t: -k3 -n /etc/passwd | tail -10 | tr 'a-z' 'A-Z'  &>  /tmp/maxuser.txt
View Code

5.取出當前主機的IP地址

ifconfig | grep -Eo "([1-9]|[1-9][1-9]|1[0-9][0-9]|2[0-5][0-4])\.([0-9]|[1-9][1-9]|1[0-9][0-9]|2[0-5][0-5])\.([0-9]|[1-9][1-9]|1[0-9][0-9]|2[0-5][0-5])\.([1-9]|[1-9][1-9]|1[0-9][0-9]|2[0-5][0-4])[[:space:]]" |grep -v "127.0.0.1"

或者
ifconfig | grep "[[:space:]*]\<inet\>" |  cut -d' ' -f10 | grep -v "127.0.0.1"
View Code

6.列出/etc目錄下所有已.conf結尾的文件的文件名,並將其名字轉換為大寫後保存至/tmp/etc.conf文件中

find  /etc  -name  "*.conf" | egrep -o "[^/][^/]*$" | tr 'a-z' 'A-Z' > /tmp/etc.test
View Code

7.顯示/var目錄下一級子目錄或文件的總數

ls /etc/ | wc -l
View Code

8.取出/etc/group第三個欄位數值最小的10個組的名字

sort -t: -k3 -n /etc/group | head -10 | cut -d: -f1
View Code

9.將/etc/fstab和/etc/issue文件的內容合併為同一個內容後保存至/tmp/etc.test文件中

cat /etc/issue  /etc/fstab | tee /tmp/etc.test  &> /dev/null
View Code

10.顯示/proc/meminfo文件中以大寫或者小寫S開頭的行,用兩種方式

[root@localhost home]# egrep "^[sS]" /proc/meminfo
[root@localhost home]# egrep  -i "^s" /proc/meminfo 
View Code

11.顯示/etc/passwd文件中其預設shell為非/sbin/nologin的用戶

[root@localhost home]# grep -v "/sbin/nologin"  /etc/passwd
View Code

12.顯示/etc/passwd文件中其預設shell為/bin/bash的用戶

[root@localhost home]# grep  "/bin/bash"  /etc/passwd
View Code

13.找出/etc/passwd文件中的一位或兩位數

[root@localhost /]# egrep "\<[[:digit:]]{1,2}\>"  /etc/passwd
View Code

14.顯示/boot/grub2/grup.cfg中至少一個空白字元開頭的行

[root@localhost /]# egrep "^[[:space:]]+[^[:space:]]"  /boot/grub2/grub.cfg 
View Code

15.顯示/etc/rc.d/rc.local文件中以#開頭,後面跟至少一個空白字元,而後又至少一個非空白字元的行

[root@localhost /]# egrep  "^#[[:space:]]+[^[:space:]]"   /etc/rc.d/rc.local 
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.
View Code

16.打出netstat -tan命令執行結果以'LISTEN'後跟空白字元結尾的行

[root@localhost /]# netstat -tan | egrep "LISTEN[[:space:]]+"
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN     
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     
tcp6       0      0 :::111                  :::*                    LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN     
tcp6       0      0 ::1:631                 :::*                    LISTEN     
tcp6       0      0 ::1:25                  :::*                    LISTEN 
View Code

17.添加用戶bash,testbash,basher,nologin(此一個用戶的shell為/sbin/nologin),而後找出當前系統上其用戶名和預設shell相同的用戶的信息

[root@localhost /]# useradd bash
[root@localhost /]# useradd testbash
[root@localhost /]# useradd basher
[root@localhost /]# useradd -s /sbin/nologin nologin
[root@localhost /]# egrep  "^(\<[a-z]+\>).*\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:2004:2004::/home/bash:/bin/bash
nologin:x:2007:2007::/home/nologin:/sbin/nologin
View Code

 


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

-Advertisement-
Play Games
更多相關文章
  • 1.Mapreduce是什麼? Mapreduce是一個分散式運算程式的編程框架,是用戶開發“基於hadoop的數據分析應用”的核心框架; Mapreduce核心功能是將用戶編寫的業務邏輯代碼和自帶預設組件整合成一個完整的分散式運算程式,併發運行在一個hadoop集群上; 2.作用 (1)海量數據在 ...
  • 單位用到了oracle存儲string類型到資料庫里的clob,上網查看資料找到解決方案。如下: 轉自:http://bestxiaok.iteye.com/blog/1027733 ...
  • 【文件管理、管道、用戶及組管理、用戶及許可權管理】\用戶及組管理 用戶與組管理 Linux系統是一個多用戶多任務的分時操作系統,任何一個要使用系統資源的用戶,都必須首先向系統管理員申請一個賬號,然後以這個賬號的身份進入系統。用戶的賬號一方面可以幫助系統管理員對使用系統的用戶進行跟蹤,並控制他們對系統資 ...
  • 暑假在家有些懈怠,不,非常懈怠— —||!良心已經發痛了,想快些補回原來的進度,但忽然發現,中斷了一段時間再重新去學習,有的地方連最基本的符號都忘記了 ,這次特意弄個最最基礎的,恢復一下,以前的進度。 1.建立一個工作空間 在home文件夾裡面發現新建好了相應的文件夾,當然裡面,空空的,什麼都沒有。 ...
  • 前言 因為比賽的限制是使用Hadoop2.7.2,估在此文章下麵的也是使用Hadoop2.7.2,具體下載地址為 "Hadoop2.7.2" 開始的準備 目前在我的實驗室上有三台Linux主機,因為需要參加一個關於spark數據分析的比賽,所以眼見那幾台伺服器沒有人用,我們團隊就拿來配置成集群。具體 ...
  • 一.環境: centos release 6.9 python 2.7.13 二.安裝工具bypy sudo pip install bypy 三.使用bypy 3.1 授權 3.2 上傳文件 bypy upload (在某個文件夾下就會將文件夾下的內容全部上傳到雲端) 3.3 下載文件 bypy ...
  • 把當前文件夾的文件名用","連接成一行,或者將多行轉變為一行 將行逆序輸出 刪除 開頭的註釋行 去掉每行開頭4個字元 對文件第一列進行統計 對文件第四列用":"切割成兩列並將最後一列結果+1,然後輸出全部列 對文件第二列求均值 實現DNA序列反向互補 某一行插入另外一個文件的內容 對一個文件按照第一 ...
  • 用戶和用戶組及許可權管理: 一:基本概念 linux是一個多任務(multi-task)多用戶(multi-user)的操作系統,每個用戶和用戶組都有自己的ID號UID GID,每個用戶都有自己的家目錄不能隨意訪問其他用戶的家目錄,管理員root除外。 用戶的分類:(以centos7.x為例) 管理員 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...