天天看點

正規表達式與grep、sed工具使用簡介

正規表達式與grep、sed工具使用簡介

一、正規表達式

其介紹如下:

\

将下一個字元标記符、或一個向後引用、或一個八進制轉義符

^

比對輸入字元串的開始位置

$

比對輸入字元串的結束位置

*

比對前面的子表達式任意次

+

比對前面的子表達式一次或多次(大于等于1次)

比對前面的子表達式零次或一次

{n}

n是一個非負整數

比對确定的n次

{n,}

至少比對n次

{n,m}

m和n均為非負整

數其中n<=m。最少比對n次且最多比對m次

.

比對除“\r\n”之外的任何單個字元

x|y

比對x或y

[xyz]

字元集合。比對所包含的任意一個字元

[^xyz]

負值字元集

合比對未包含的任意字元

[a-z]

字元範圍。比對指定範圍内的任意字元

[^a-z]

負值字元範圍。比對任何不在指定範圍内的任意字元

[A-Z]

大寫字母集

( )

定義組,可以用\1、\2等引用

\b

比對一個單詞邊界

\B

比對非單詞邊界 

\d

比對一個數字字元

\D

比對一個非數字字元

\n

比對一個換行符

\r

比對一個回車符

\s

比對任何不可見字元

\S

比對任何可見字元

\t

比對一個制表符

\v

比對一個垂直制表符

\w

比對包括下劃線的任何單詞字元

\W

比對任何非單詞字元

\f

比對一個換頁符

二、grep介紹與用法

    grep的選項:

    -n 顯示行号

    -o 隻顯示比對的内容

    -q 沒有任何輸出,即靜默模式

    -I 如果比對成功隻将檔案名列印出來

    -A 2 如果比對成功将其後兩行一起列印出來不帶數字列印一行

    -B 2 如果比對成功将其前兩行一起列印出來不帶數字列印一行

    -C 2 如果比對成功将其前後兩行一起列印出來不帶數字列印一行

    --color 帶顔色列印

    -c count即将比對到的行數列印出來

    -E 相當于egrep

    -i 不區分大小寫

    -v 取反,即不比對

    -w 比對單詞

練習:

    目标檔案/etc/passwd,使用grep指令或egrep

1.顯示出所有含有root的行:

<a href="https://s3.51cto.com/wyfs02/M00/8F/0D/wKiom1jSL_6TGCRqAAAx-no2niI418.png-wh_500x0-wm_3-wmp_4-s_3938902023.png" target="_blank"></a>

2.輸出任何包含bash的所有行,還要輸出緊接着這行的上下各兩行的内容:

3.  顯示出有多少行含有nologin。

<a href="https://s2.51cto.com/wyfs02/M00/8F/0B/wKioL1jSMNiiak_HAAARpJxHOUc363.png-wh_500x0-wm_3-wmp_4-s_296071668.png" target="_blank"></a>

4.顯示出那些行含有root,并将行号一塊輸出。

<a href="https://s2.51cto.com/wyfs02/M00/8F/0D/wKiom1jSMQfxfbrdAAAgN8cR_o4467.png-wh_500x0-wm_3-wmp_4-s_2587489190.png" target="_blank"></a>

5.顯示出檔案

<a href="https://s2.51cto.com/wyfs02/M01/8F/0D/wKiom1jSMTGiKMgaAAAVPgt98Ws567.png-wh_500x0-wm_3-wmp_4-s_3436616209.png" target="_blank"></a>

6.建立使用者

abominable

abominate

anomie

atomize

編寫正規表達式,将他們比對出來

<a href="https://s3.51cto.com/wyfs02/M00/8F/0B/wKioL1jSN0jRB9AlAAA_w5Wty98229.png-wh_500x0-wm_3-wmp_4-s_3403521230.png" target="_blank"></a>

7.建四個使用者

Alex213sb

Wpq2222b

yH438PIG

egon666

egon

            過濾出使用者名組成是字母+數字+字母的行

<a href="https://s4.51cto.com/wyfs02/M02/8F/0B/wKioL1jSOhjwBbNzAABAqY3BcEc459.png-wh_500x0-wm_3-wmp_4-s_944978490.png" target="_blank"></a>

8.顯示出/etc目錄下所有包含root的檔案名

9. 過濾掉/etc/ssh/sshd_config内所有注釋和所有空行

<a href="https://s2.51cto.com/wyfs02/M01/8F/0C/wKioL1jSRHSAG4GAAADHHVonvrE061.png-wh_500x0-wm_3-wmp_4-s_4038545495.png" target="_blank"></a>

三、sed的介紹與用法

    sed 是一種流編輯器,它一次處理一行内容。處理時,把目前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接着用sed指令處理緩沖區中的内容,處理完成後,把緩沖區的内容送往螢幕。接着處理下一行,這樣不斷重複,直到檔案末尾。檔案内容并沒有 改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個檔案;簡化對檔案的反複操作;編寫轉換程式等。

    sed [-nefr] [command]

選項與參數:

-n :使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN 的資料一般都會被列出到終端上。但如果加上 -n 參數後,則隻有經過sed 特殊處理的那一行(或者動作)才會被列出來。

-e :直接在指令列模式上進行 sed 的動作編輯;

-f :直接将 sed 的動作寫在一個檔案内, -f filename 則可以運作 filename 内的 sed 動作;

-r :sed 的動作支援的是延伸型正規表示法的文法。(預設是基礎正規表示法文法)

-i :直接修改讀取的檔案内容,而不是輸出到終端。

command:

a :新增, a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)

c :取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行

d :删除,因為是删除啊,是以 d 後面通常不接任何東西

i :插入, i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行);

p :列印,亦即将某個選擇的資料印出。通常 p 會與參數 sed -n 一起運作

s :取代,可以直接進行替換的功能,通常這個 s 的動作可以搭配正規表示法 例如 1,20s/舊字元串/新字元串/g 

以/etc/passwd檔案為模闆

1,删除檔案每行的第一個字元。

<a href="https://s3.51cto.com/wyfs02/M02/8F/0F/wKiom1jSU62gM58vAADGkdQovMQ626.png-wh_500x0-wm_3-wmp_4-s_2542138768.png" target="_blank"></a>

2,删除檔案每行的第二個字元。

<a href="https://s4.51cto.com/wyfs02/M01/8F/0C/wKioL1jSVI2zd0_vAABuH8bOZ5w952.png-wh_500x0-wm_3-wmp_4-s_1942284069.png" target="_blank"></a>

3,删除檔案每行的最後一個字元。

<a href="https://s3.51cto.com/wyfs02/M00/8F/0F/wKiom1jSVN7S4ud1AABvkye9-v8056.png-wh_500x0-wm_3-wmp_4-s_764772418.png" target="_blank"></a>

4,删除檔案每行的倒數第二個字元。

<a href="https://s3.51cto.com/wyfs02/M00/8F/0F/wKiom1jSVS6hFnePAABu7IvACms779.png-wh_500x0-wm_3-wmp_4-s_3074137360.png" target="_blank"></a>

5,删除檔案每行的第二個單詞。

<a href="https://s1.51cto.com/wyfs02/M01/8F/0D/wKioL1jSV4Kg0OOnAACaOWQadIM902.png-wh_500x0-wm_3-wmp_4-s_1011328415.png" target="_blank"></a>

6,删除檔案每行的倒數第二個單詞。

<a href="https://s5.51cto.com/wyfs02/M02/8F/0F/wKiom1jSWImBgAYvAABj5IrLO8Y824.png-wh_500x0-wm_3-wmp_4-s_4138013003.png" target="_blank"></a>

7,删除檔案每行的最後一個單詞。

<a href="https://s4.51cto.com/wyfs02/M00/8F/0F/wKiom1jSWLmx_lodAABuDNJuKb0028.png-wh_500x0-wm_3-wmp_4-s_2084132930.png" target="_blank"></a>

8,交換每行的第一個字元和第二個字元。

<a href="https://s5.51cto.com/wyfs02/M01/8F/0F/wKiom1jSWTbBdwjHAACABwuwLQM176.png-wh_500x0-wm_3-wmp_4-s_1460897526.png" target="_blank"></a>

9,交換每行的第一個字元和第二個單詞。

<a href="https://s3.51cto.com/wyfs02/M00/8F/0F/wKiom1jSWrSyMpTdAADF-mnQ9lM044.png-wh_500x0-wm_3-wmp_4-s_370545484.png" target="_blank"></a>

10,交換每行的第一個單詞和最後一個單詞。

<a href="https://s2.51cto.com/wyfs02/M02/8F/0D/wKioL1jSXCeAz0kDAACENh54eRs829.png-wh_500x0-wm_3-wmp_4-s_1353857043.png" target="_blank"></a>

11,删除一個檔案中所有的數字。

<a href="https://s1.51cto.com/wyfs02/M00/8F/0F/wKiom1jSXJPRROKVAACXrWSyK08675.png-wh_500x0-wm_3-wmp_4-s_4110002114.png" target="_blank"></a>

12,删除每行開頭的所有空格。

<a href="https://s3.51cto.com/wyfs02/M00/8F/0D/wKioL1jSXYrznwsKAABirmmWM4M205.png-wh_500x0-wm_3-wmp_4-s_3965667132.png" target="_blank"></a>

13,用制表符替換檔案中出現的所有空格。

<a href="https://s5.51cto.com/wyfs02/M01/8F/0F/wKiom1jSXeLxV6oCAACLfMthc9o274.png-wh_500x0-wm_3-wmp_4-s_4130006748.png" target="_blank"></a>

14,把所有大寫字母用括号()括起來。

<a href="https://s3.51cto.com/wyfs02/M00/8F/0D/wKioL1jSXruADo9-AAB_jw-X5Go111.png-wh_500x0-wm_3-wmp_4-s_3274685327.png" target="_blank"></a>

15,列印每行3次。

<a href="https://s2.51cto.com/wyfs02/M00/8F/0F/wKiom1jSYemQhYqtAACALRZjFHg155.png-wh_500x0-wm_3-wmp_4-s_360292407.png" target="_blank"></a>

16,隻顯示每行的第一個單詞。

<a href="https://s5.51cto.com/wyfs02/M00/8F/0D/wKioL1jSYrTDD6a2AABCfp7fLfQ732.png-wh_500x0-wm_3-wmp_4-s_3243362359.png" target="_blank"></a>

18,用指令擷取格式為    mm/yy/dd    的日期格式,結合管道,将其換成   mm;yy;dd格式

<a href="https://s1.51cto.com/wyfs02/M02/8F/0F/wKiom1jSZ9HTkxLNAAAegeQb1hw583.png-wh_500x0-wm_3-wmp_4-s_4253479773.png" target="_blank"></a>

本文轉自 AltBoy 51CTO部落格,原文連結:http://blog.51cto.com/altboy/1909354