天天看點

linux正規表達式 概念,shell正規表達式

正則定義

規定一些特殊文法表示字元類,數量限定符,位置關系,然後用這些特殊文法和普通字元一起表示億額模式,這就是正規表達式

正則三要素字元類

數量限定符

位置限定符

正則中使用單引号保證内部字元不被shell解釋掉

字元類.  比對任意一個字元

[] 比對括号中的任意一個字元

-  在[]中表示字元範圍

^ 位于[]内的開頭,表示比對除了括号中字元外的任意一個字元

[[:xxx:]] grep工具預定義的一些命名字元類 eg alpha字  digit 數字

數量限定符?前邊字元0-1次

+前邊字元1-多次

*前邊字元0-多次

{n}前邊單元N次.比對滿足就傳回,也可能後邊重複多餘N次

{n,}至少n次

{m,n}m到n次,也可能多餘n次..可以增加$結尾限制

位置限定符^比對行首位置

$行尾位置

\

\>比對單詞結尾位置

\b比對單詞開始或者結尾位置

\B比對非單詞開頭和結尾的位置

其他特殊字元\ 轉義

()将整個正規表達式組成一個單元,使用數量限定符

| 連接配接兩個子表達式,表示或的關系

注:以上為grep正規表達式的extended規範,base也有,但是字元?+{}\()解釋為普通字元,要表示上述含義需要加\轉義.-E同理

sed

基本概念:sed是一種流式編輯器(stream idter)

基本格式sed option -f scriptfile file1 file2

sed option 'script' file1 file2

sed的編輯指令可以直接當指令行參數傳入,也可以寫成一個腳本文 件然後用-f參數指定,編輯指令的格式為/pattern/action

sed是一種線上編輯器,每次處理一行内容.每次處理将目前行放入緩存"模式空間",模式空間處理完成後移動到螢幕

格式1. /pattern/p :列印比對pattern的行    P(print)  sed -n  '111' log  相當于grep,預設會列印一遍原文以及比對項

2. /pattern/d :删除比對pattern的行    D(delete)

3. /pattern/s/pattern1/pattern2/:查找符合pattern的行,将該行第一個比對pattern1的字元串替換為pattern2

4./pattern/s/pattern1/pattern2/g:查找符合pattern的行,将該行所有比對pattern1的字元串替換為pattern2

eg:  sed   '/^t/s/Z/--&--/g'   log

将log檔案中所有的t字元開始的(正則獅)行中的Z替換為--Z--,,,&符号表示比對pattern1的字元串

sed '/^[0-9]/s/\([0-9]*\)/~\1~' log将0-9開始的,0-9*替換為~0-9~   .因為sed預設使用basic正則,是以()需要轉義,   -r使用extended

pattern2中的\1表示與pattern1的第一個括号比對的内容.\2表示與pattern1中第二個括号比對的内容

5.sed -i 做的修改會先修該原文

6.定址:用于據定對哪些行進行編輯.位址形式可以是數字,正則或者二者結合.如果沒有定制,那麼sed處理所有的行

eg

sed -n  '3p' file  列印第三行

sed -n '100,300p' fiile 列印[100,300]行

sed '/start/, /end/d' file 删除start 和end行之間的行

7.指令和選項

sed指令告訴sed如何處理由位址指定的各輸入行,如果沒有指定則處理所有的輸入行

指令:

a\在目前行後添加一行或者多行,多行,每行需要用"\"續行

c\用次符号厚的新聞本替換目前行的文本 .....\

i\在目前行中插入文本,......

h吧模式空間李的内容指派到暫存緩沖區

H吧模式空間的内容追加到暫存...

g複制,覆寫緣由内容

G追加

I列出非列印字元

p列印行

q結束或退出sed

r從檔案讀取輸入行

!對所選行意外的所有行應用名林

s替換

g行内進行全局替換

w将所選行寫入檔案

x交換暫存緩沖區與模式空間的内容

y将字元替換為另一個字元

選項

-e進行多項編輯

-n取消預設的輸出

-f指定sed腳本的檔案名

正規表達式

^行首定位

$行尾定位

. 除換行以外的單個字元

*比對0-多個前導字元

[]任意一個

[^ ]取反

\(..\) 定義元祖标簽,之後可以使用\1  \2 ... \9引用

&儲存查找串以便替換中引用.

\< \>詞頭詞尾

x\{m\} 連續m個x

...

...

awk

sed以行為機關處理檔案,awk更強,還能以列僞機關處理檔案.

行分割預設換行

列分割預設連續空格和tab.

分割符也可以自己定義

指令基本形式awk option 'script'  file1 file2

swk option -f scriptfile file1 file2

/pattern/{actions}

如果每日有pattern部分,那麼所有行都執行actions部分.

自動變量$1 $2 ... 分别表示第1列................... $0 表示整個目前行

awk有類似的print語句,還有兩個特殊變量condition-BEGIN和END

BEGIN後邊的句子在整個檔案之前執行一次,END之後的句子在整個檔案之後執行一次

搜尋 -F

awk -F: '/root/' /etc/passwd

調用方式

1指令行方式awk[-F field-separator] 'commands' input-file(s)

commands是awk指令,[-F 域分割符]是可選的. input-file是待處理檔案

2shell腳本方式#!/bin/awk -f

BEGIN{

count1=0;

count2=0;

}

{

if($1<100)

count1++;

}

else{

count2++;

}

END{

printf("%d",count2);

}

3将所有的awk指令插入一個單獨檔案,然後調用:awk -f awk-script-file input-file(s)

awk調用正規表達式

A.awk語句:awk '/REG/{action}'

B.awk正則運算語句(~,~! 等同! ~)

C.awk内置使用正規表達式函數gsub(Ere,Reql,[In])

sub(Ere,Reql,[In])

match(string,Ere)

split(sting,A,[Ere])

awk内置變量&&雜項ARGC

ENVIRON

FILENAME

FNR 浏覽檔案的記錄數

FS 等價-F

NF浏覽記錄的域的個數

NR已讀的記錄數

OFS輸出域分隔符

ORS輸出記錄分隔符

RS控制記錄分隔符

$0 整條記錄

$1...$.. 第n個域

print

printf 和c語言printf類似

awk進階

1循環(類C)

2條件(類C)

3數組  下标鍵值

CUT

在檔案中負責剪貼資料,以每一行為一個處理對象

剪貼依據(三個定位方式)位元組(bytes) -b

cut -b 1-3  file      #按照位元組剪貼1-3個字元

字元(characters) -c域(fields) -f

-d指定域分割符,-f指定檢出哪幾個域

cut -d: -f 1-2,5 /etc/passwd

sort按照字元ascii排序

-u去除重複行

-r将預設升序修改為降序

-o将結果重定向寫入檔案,可以指定到源檔案

-n以數字方式排序而非碼拍.

-t 設定分隔符, -k指定分割之後的列.實作第k列排序

-f忽略大小寫比較

-c檢查是否已排序,如果亂序,輸出第一個亂序的行的相關資訊.傳回1

-C檢查,如果未排序,傳回1

-M以 月份方式排序

-b忽略空白

uniq

去除重複-c顯示輸出中,在每行行首加上本行出現次數,取代-u,-d

-d隻顯示重複行

-u隻顯示不重複

tcpdump

strace

archlinux

gento