1. 程式人生 > >Linux 常用命令sed/awk/grep及正則表示式

Linux 常用命令sed/awk/grep及正則表示式

sed

主要功能

sed,stream editor。是一個”非互動式“字元流編輯器。輸入流通過程式並輸出到標準輸出端。
sed主要用來自動編輯一個或者多個檔案(替換,插入,刪除,追加,更改)

常見應用

  1. 抽區域
  2. 匹配正則表示式
  3. 比較域
  4. 增加,附加,替換

執行過程

sed一次處理一行或多行內容。處理時,把當前處理的行儲存在臨時緩衝區中,稱為“模式空間”(pattern space),接著用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往螢幕。接著處理下一行或多行,這樣不斷重複,直到檔案末尾。檔案內容並沒有改變,除非你使用重定向或寫入命令儲存輸出。

呼叫方式

  • 命令列輸入

sed [選項] ‘sed命令’ 輸入檔案

  • 使用sed指令碼
    sed [選項] –f sed指令碼檔案 輸入檔案

常用選項

-n:不列印,不寫編輯行到標準輸出,預設情況下列印所有行[編輯/未編輯]p命令可以列印編輯行

-c:下一命令是編輯命令,使用多項編輯時加入此選項

-f: 呼叫sed指令碼 sed –f sedScriptFile targetFile

-i:將修改附加到原始檔上

使用技巧

重定向sed結果輸出
$sed ‘sed-command’ inputfile > outputfile

定位內容的方式

x 行x

x,y 行x到行y

/pattern/ 模式

/pattern/pattern/ 兩個模式

/pattern/,x

 模式+行【在給定行號上查詢模式】

X,y /pattern/ 通過行號和模式查詢匹配行

X,y! 不包含指定行號

基本的sed命令

P 列印匹配行 print

= 列印匹配行行號

a\ 定位行號後附加新文字資訊 append

i\ 定位行號後插入 insert

d 刪除定位行 delete

c\ 用新文字替換定位文字 change

s 使用替換模式替換相應模式

r 從另一個檔案中讀文字 read

w 寫文字到一個檔案 write

q 第一個模式匹配完成後退出或立即退出

{} 定位執行命令組

n 從另一個檔案中讀文字下一行,並附加在下一行

g 將模式2黏貼到/pattern n/

y 傳送字元

例項:

  • 顯示文字

$sed -n '1,4p' file

顯示1-4行

$sed -n '4,/Str/p'

顯示第4行到匹配到Str的一行,/str/代表匹配到的一行

  • 插入修改文字

$sed '/str/a\ "inserted line"' file

在滿足條件的行後,插入內容

sed '/str/i\ "appended line"' file

在滿足條件的行前插入內容

$sed '3 c\ "changed line"' file

滿足條件的行,整行替換掉

  • 刪除文字

$sed '1,3d' file

刪除1-3行

$sed '/str/d' file

刪除匹配行

$sed -n '/Begin/,/End/p' file | more

刪除兩個匹配行之間的資料

  • 替換文字

格式:[address[,address]] s/pattern-find/replacement-pattern/[g,p,w,n]

n 1到512之間的一個數字,表示對本模式中指定模式第n次出現的情況進行替換。

g 對模式空間所有出現的情況進行全域性更改【預設只替換首次出現的模式 】

p 列印模式空間的內容

w file

$sed 's/str/tostr/' file

替換每一行首次出現的str為tostr

$sed 's/str/tostr/g' file

替換所有的行內,出現的所有str為tostr

$sed 's/str/tostr/w output' file

替換後重定向到output

轉換字元

sed 'y/cp/wd/' test.txt

c轉換成w,p轉換成d

  • Shell向sed傳值

echo $input | sed 's/bb/'$str'/'

echo $input | sed "s/bb/$str/"

awk

主要功能

awk是一種用於處理文字的工具,主要用於格式化報文,或從一個大文字中抽取資料。

執行過程

awk每次讀入一行,執行’ ‘中的內容,按模式匹配來採取動作

格式

awk 'pattern+{action}' file

pattern用於篩選查詢匹配行,決定了動作何時觸發,可以使用條件語句,正則表示式

action用於對篩選後的內容進行處理

BEGIN可以設定計數和列印頭(可選)

END列印輸出文字總數和結尾狀態標識(可選)

常用引數

-F 指定讀取一行資料的分隔符,預設為空格
-f 指定處理程式的指令碼檔案,這個檔案必須符合awk語法

呼叫方式:

awk –f awk-script-file input-files

常用內建引數

$0,$1,....$n $0代表當前行的內容,$i代表當前行被分割後的第i個欄位的內容

ARGC 命令列引數個數

ARGV 命令列引數排列

ENVIRON 支援佇列中系統環境變數的使用

FILENAME 實際操作的檔名

FNR 瀏覽檔案記錄數,<=NR

FS 設定輸入域分隔符,等價於命令列-F選項 ,可在BEGIN中進行設定,然後執行的時候均以設定的符號為分隔符

NF 瀏覽記錄 域的個數,在記錄被讀取時設定【number of fields】一共有多少個域

NR 已讀取記錄數【number of rows】

RS 控制記錄分隔符,預設:新行\n,Row Separator記錄分隔符,可以根據具體資料需求,設定讀取一條記錄的區間

OFS 輸出域的分隔符,預設空格,輸出結果 print $1,$2預設加的是空格,可以在BEGIN中設定,改為其他分隔符

ORS 輸出記錄的分隔符,預設:新行\n,整體記錄的

例項

  • 列印

列印所有行

awk '{print $0}' file

列印包含頭尾

awk 'BEGIN{print "Name Age"}{print $1,$2}END{print "END_OF_REPORT"}'

  • 使用判斷語句

< <= > >= == !=

~匹配正則 !~不匹配正則

|| && ! 或且非

awk '{if($2!~/Rudy/) print $0}' content

awk '{if($1=="001" && $2~/^Ru/) print $0}' content

  • 使用內建的變數

awk 'BEGIN{OFS='\t'}{print NF,NR,$0}END{print FILENAME}' content > output

設定輸出的分隔符為’\t’,輸出一些內建變數的資訊

  • AWK變數中的字串和數字的轉換

字串->整數

$ awk 'BEGIN{a="100";b="10test10";print (a+b+0);}'

110

只需要將變數通過”+”連線運算。自動強制將字串轉為整型。非數字變成0,發現第一個非數字字元,後面自動忽略。

整數->字串

awk 'BEGIN{a=100;b=100;c=(a""b);print c}'

100100

只需要將變數與””符號連線起來運算即可。

  • 使用內建的字串函式

gsub(r,s) 在整個$0中用s代替r

gsub(r,s,t) 在整個t中用s替代r

index(s,t) 返回s中字串t的第一位置

length(s) 返回s長度

match(s,r) 測試s是否包含匹配r的字串

split(s,a,fs) 在fs上將s分成序列a.fs為分隔符

sprint(fmt,exp) 返回經fmt格式化後的exp

sub(r,s) 用$0中最左邊最長的子串代替s

substr(s,p) 返回字串s中從p開始的字尾部分

substr(s,p,n) 返回字串s中從p開始長度為n的字尾部分

替換字串

awk 'BEGIN{FS='\t'}{gsub(/Rudy/,"RUDY");{print $0}}' content

  • 使用printf進行格式化輸出

%c ASCII字元

%d 整數

%e 浮點數,可科學計數法

%f 浮點數,小數形式

%g 由awk決定使用哪種浮點數轉換e或f

%o 八進位制

%s 字串

%x 十六進位制

格式化輸出一個字串

awk -F'\t' '{printf("%s\t%s\n",$2,$1)}' content

  • 向awk中傳遞引數

awk '{if($3<=AGE){print $0}}' AGE=20 content

  • 寫一個awk指令碼

    #!bin/awk -f
    BEGIN{
            FS="['\t']"
            printf("%s\t%s\t%s\n","NUMBER","NAME","AGE")
    }
    {
            printf("%s\t%s\t%s\n",$1,$2,$3)
    }
    END{
            print "END OF FILE"
    }

linux正則表示式和grep

正則表示式

正則表示式描述了一種字串匹配的模式,常用於:

  • grep:從特定的檔案中或從標準輸入中查詢含有某個字串的行
  • sed :從輸入中讀取資訊,經過編輯後輸出
  • awk: 偽裝成實用程式的強大程式語言,主要用於文字處理

常用符號

基本元字元

^ 行首定位符,表示以..開始

$ 行尾定位符,表示以..結束

. 匹配單個字元

* 匹配0個或任意多個字元

[] 匹配[]中出現字元範圍內的一個字元

\ 用來轉義元字元,如{m,n},啟用擴充套件元字元\? +

擴充套件元字元

? 匹配0個或者1個

+ 匹配1個或者多個

| 或者

()分組符號

特殊匹配字元

[:alnum:] 字母與數字字元

[:alpha:] 字母

[:ascii:] ASCII字元

[:blank:] 空格或製表符

[:cntrl:] ASCII控制字元

[:digit:] 數字

[:graph:] 非控制、空格字元

[:lower:] 小寫字母

[:print:] 可列印字元

[:punct:] 標點符號字元

[:space:] 空白字元,包括垂直製表符

[:upper:] 大寫字母

[:xdigit:] 十六進位制數字

例項

  • ^ $
    ls -l | grep ^d

匹配以d開頭的所有內容

  • ls -l | grep d$

匹配以d結束的所有內容

  • ^$

匹配空行

  • ^.$

只包含一個字元的

  • * ? +

compu*ter 匹配u,重複0次或多次

compu?ter 匹配0個或者1個u

compu+ter 匹配1個或多個u

需要注意的是+和?是擴充套件字元,需要看具體使用正則表示式的環境
如果使用grep需要使用-E指定為擴充套件模式才能正常使用+和?

  • \可以遮蔽一些特殊字元,如$ . ‘ “ * [ ] ^ | ( ) \ + ?

\.pass 匹配*.pass

  • []

[1234] 匹配1,2,3,4中的一個

[1-9] 數字1-9中的一個

[A-Za-z] 所有字母

[^0-9] 一個非數字的字元

  • \{\}

A\{2\}B 匹配AAB

A\{4,\}B 匹配A出現至少4次B

A\{2,4\}B 匹配A出現在2至4次之間

grep

功能:grep是文字搜尋工具,使用正則表示式搜尋文字並列印匹配行

格式:grep [options] PATTERN [Files]

注:

輸入字串作為引數,最好雙引號括起 “mystr”

呼叫變數時,也使用雙引號括起 “$MYSTR”

使用正則[匹配模式]是,應使用單引號括起 ‘49[32]’

常用選項:

-c 只輸出匹配的行數,而不輸出匹配的行

-i 不區分大小寫

-n 顯示匹配行及行號

-q 安靜模式,不輸出任何東西,如果找到了返回0

-E 啟用擴充套件表示式,可使用擴充套件字元,如:+ ? | () {} , 或者直接使用egrep

-v 顯示不包含匹配文字的所有行

例項:

  1. 在多個檔案中查詢
    grep “sort” filea fileb 在filea,fileb中查詢

  2. 計算匹配行數
    grep -c "sort" file

  3. 使用正則表示式查詢
    grep '48[34]' file

  4. 使用擴充套件元字元
    grep -E 'aaa|bbb' file

  5. 匹配空行
    grep '^$' file

  6. 特殊匹配字元,grep 允許使用國際字串模式匹配或匹配模式的類名
    grep ‘5[[:upper:]] [[:upper:]]’ data 5開頭,兩個大寫

正則表示式

簡介

描述了一種字串匹配的模式,常用於:
grep:從特定的檔案中或從標準輸入中查詢含有某個字串的行
sed :從輸入中讀取資訊,經過編輯後輸出
awk: 偽裝成實用程式的強大程式語言,主要用於文字處理
程式語言:如python

符號

基本符號

^ 行首定位符,表示以..開始
$ 行尾定位符,表示以..結束
. 匹配單個字元
* 匹配0個或任意多個字元
[] 匹配[]中出現字元範圍內的一個字元
\ 用來轉義元字元,如{m,n},啟用擴充套件元字元\? +

擴充套件元字元

grep支援基本元字元,通過egrep或者grep -e可以啟用擴充套件元字元。

? 匹配0個或者1個
+ 匹配1個或者多個
| 或者
()分組符號
{i}表示出現了i次,{i,j}表示出現了i到j次

\n 匹配一個換行符。
\t 匹配一個製表符。
\d 匹配一個數字,等價於[0-9]
\D 匹配一個非數字,等價於[^0-9]
\s 匹配任何空白字元,包括空格、製表符、換頁符等等。等價於[ \f\n\r\t\v][^\s]表示任何非空白字元
\S 匹配任何非空白字元。等價於[^ \f\n\r\t\v]。

\w 匹配包括下劃線的任何單詞字元。等價於“[A-Za-z0-9_]”
\W 匹配任何非單詞字元。等價於“[^A-Za-z0-9_]”。[^\w]
注意\S\w包括@#¥等更多特殊字元

簡單例項

  • ^ $
    ls -l | grep ^d 匹配以d開頭的所有內容
    ls -l | grep d$ 匹配以d結束的所有內容
    ^$ 匹配空行
    ^.$只包含一個字元的
    
  • * ? +
    compu*ter 匹配u,重複0次或多次
    compu?ter 匹配0個或者1個u
    compu+ter 匹配1個或多個u
    
  • \
    可以遮蔽一些特殊字元,如$ . ‘ “ * [ ] ^ | ( ) \ + ?
  • []

    [1234] 匹配1,2,3,4中的一個
    [1-9] 數字1-9中的一個
    [A-Za-z] 所有字母
    [^0-9] 一個非數字的字元
    
  • {}

                
               

    相關推薦

    Linux 常用命令sed/awk/grep表示式

    sed 主要功能 sed,stream editor。是一個”非互動式“字元流編輯器。輸入流通過程式並輸出到標準輸出端。 sed主要用來自動編輯一個或者多個檔案(替換,插入,刪除,追加,更改) 常見應用 抽區域匹配正則表示式比較域增加,附加,替換 執行過程 sed一次處理一行或多行內容。處理時,把

    inux基礎命令 sed awk grep 部分快捷鍵

    退出 查看命令 數列 sed -n inux clear -a 出錯 ctrl+ 基本命令 sed stream deitor(編輯器) 流編輯器,實現對文件的增加刪除及該替換查 1、使用sed命令 進行查看 [root@VM_86_3_centos 0

    Linux日常——shell工具之grep(包含表示式)、sed

    grep行過濾器 grep是⼀種查詢過濾⼯具 正則表示式在grep中⽤來查詢符合模式的字串。 egrep相當於grep -E,表⽰採⽤Extended正則表示式語法。 fgrep相當於grep - F,表⽰只搜尋固定字串⽽不搜尋正則表示式模式,不會按正則

    Linux使用者組和許可權管理表示式

    1、複製/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部檔案的屬組和其他使用者沒有任何訪問許可權。 [[email protected] ~]# cp -a /etc/skel /home/tuser1 [[email protected] ~]#

    grep,sed,awk與簡單表達式應用

    Linux學習grep,sed,awk與簡單正則表達式應用 這裏使用的測試文件是linux /etc/passwd文件,最好是復制一份進行練習,方式對文件內容造成損壞。感覺還是要多練習才能很好的使用,習題這裏就不貼了,網上一找一大把。 grep:   -o 用作計算出現多少次字段&e

    Linux常用命令——sed

    一次 9.png num edit sta bak RoCE 空白 開頭 sed 字符流編輯器 sed 是Stream Editor(字符流編輯器)的縮寫,簡稱劉編輯器。sed 是操作、過濾和轉換文本內容的強大的工具。常用功能包括對文件實現快速增刪改查,其中查詢的功能中最常

    Linux常用命令(二 ): grep命令

    Linux grep命令用於查詢檔案裡符合條件的字串。 grep指令用於查詢內容包含指定的範本樣式的檔案,如果發現某檔案的內容符合所指定的範本樣式,預設grep指令會把含有範本樣式的那一列顯示出來。若不指定任何檔名稱,或是所給予的檔名為"-",則grep指令會從標準輸入裝置讀取資料。 語法

    快速掌握grep命令表示式

    Linux系統自帶了支援拓展正則表示式的 GNU 版本 grep 工具,所有的Linux發行版中均預設安裝grep ,grep 命令被用來檢索一臺伺服器或工作站上任何位置的文字資訊,如何在 Linux 系統和類 Unix 的作業系統中使用帶正則表示式的 grep 命令呢?

    2.6-grep表達式

    grep及正則表達式grep: Linux上文本處理三劍客 grep:文本過濾(模式:pattern)工具 grep,egrep,fgrep(fast grep) sed:stream editor,文本編輯工具 awk:Linux上的實現

    shell編程初步、grep表達式

    Linux shell 正則表達式 bash的基礎特性(3)1、提供了編程環境 程序=指令+數據 程序編程風格過程式:以指令為中心,數據服務於指令對象式:以數據為中心,指令服務於數據 shell程序:提供了編程能力,解釋執行 程序的執行方式:計算機:運行二進制指令編程語言:低級:匯編高級:編譯:高

    學習之路(三)淺談:輸出重定向,grep表達式,egrep

    grep 地址總線:內存尋址 數據總線:傳輸數據 控制總線:控制指令 > :輸出重定向(會覆蓋原有內容) >>: 追加重定向(不會覆蓋,追加輸出) 2>: 重定向錯誤輸出 2

    Linux練習題-文本管理工具表達式

    目錄名 地址 ini 登錄 images netstat last 命令 tst 1、找出ifconfig “網卡名” 命令結果中本機的IPv4地址方法1:ifconfig ens33 | grep -w "inet" | tr -s ' 

    LINUX學習—grep表示式LINUX三劍客)

    grep, egrep, fgrep grep(GLOBAL RESEARCH) 是一種強大的文字搜尋工具,它能使用正則表示式搜尋文字,並把匹配的行打印出來。根據模式,搜尋文字,並將符合模式的文字行顯示出來。只能使用基本正則表示式 要使用擴充套件正則表示式需要-E pattern

    第四周作業(alias、grep表示式、find命令的基本用法)

    1.命令別名 alias的用法 通過alias命令實現: (1)alias不帶任何選項將顯示當前shell下所有的可用的命令別名的資訊,其中,等號之前表示新的命令名稱,等號右邊表示的是要替代的命令及其引數。 (2)定義別名: alias new_name='old_name options' 注:通

    sed表示式

    9.4/9.5 sed sed sed 是一種新型的,非互動式的編輯器。它能執行與編輯器 vi 和 ex 相同的編輯任務。sed 編輯器沒有提供互動式使用方式,使用者只能在命令列輸入編輯命令、指定檔名,然後在螢幕上檢視輸出。sed 編輯器沒有破壞性,它不會修改檔

    linux(ubuntu)文字處理工具表示式

    grep egrep(文字過濾) fgrep(不支援正則) 格式 grep [選項] 模式 檔案 選項:--color 指定顏色          -v反向匹配,顯示不能被模式匹配到的行       &n

    java學習--常用表示式

    宣告:由於學習所用環境為JDK1.8,所有java程式碼均在JDK1.8環境中測試通過,如果環境發生變化,可能會發生錯誤! 一、常用類 1、Math類 (1)Math 類提供了一序列基本數學運算和幾何函式的方法。     Math類是final類,並且它的所有成員變數和成員

    linux 下利用ls grep表示式實現目錄和檔案的分開顯示

    要列出當前目錄下所有的檔名和目錄名直接使用ls命令即可。但如何只列出檔名而不列出目錄呢?查遍了ls 的幫助,也沒看到有這個現成的選項。幸好這個問題還是比較常見的,網上已經有了一些解答,但實驗之後,我發現看到的幾個連結給出的解決方法都是不完全正確的。具體如下。一、網上流傳的解

    文字處理表示式

    文字處理及正則表示式 檔案檢視 檔案檢視命令: cat,tac,rev cat [OPTION]… [FILE]… cat -E:顯示行結束符$ -n:對顯示出的每一行進行編號 -A:顯示所有控制符 -b:非空行編號 -s:壓縮連續的空行成一行 ta

    Elasticsearch中的萬用字元表示式查詢

    想要在ES中使用*或者?作為萬用字元進行模糊匹配? 看這篇就對了~ 本文為轉發!!! 轉自:https://blog.csdn.net/dm_vincent/article/details/42024799 wildcard查詢和prefix查詢類似,也是一個基於詞