使用s e d在文件中定位文本的方式 php
x x爲一行號,如1
x , y 表示行號範圍從x到y,如2,5表示從第2行到第5行
/ p a t t e r n / 查詢包含模式的行。例如/ d i s k /或/[a-z]/
/ p a t t e r n / p a t t e r n / 查詢包含兩個模式的行。例如/ d i s k / d i s k s /
p a t t e r n / , x 在給定行號上查詢包含模式的行。如/ r i b b o n / , 3
x , / p a t t e r n / 經過行號和模式查詢匹配行。3 . / v d u /
x , y ! 查詢不包含指定行號x和y的行。1 , 2 ! html
使用s e d在文件中定位文本的方式 正則表達式
x x爲一行號,如1
x , y 表示行號範圍從x到y,如2,5表示從第2行到第5行
/ p a t t e r n / 查詢包含模式的行。例如/ d i s k /或/[a-z]/
/ p a t t e r n / p a t t e r n / 查詢包含兩個模式的行。例如/ d i s k / d i s k s /
p a t t e r n / , x 在給定行號上查詢包含模式的行。如/ r i b b o n / , 3
x , / p a t t e r n / 經過行號和模式查詢匹配行。3 . / v d u /
x , y ! 查詢不包含指定行號x和y的行。1 , 2 ! shell
sed編輯命令 編程
p 打印匹配行
= 顯示文件行號
a 在定位行號後附加新文本信息
i 在定位行號後插入新文本信息
d 刪除定位行
c 用新文本替換定位文本
s 使用替換模式替換相應模式
r 從另外一個文件中讀文本
w 寫文本到一個文件
q 第一個模式匹配完成後推出或當即推出
l 顯示與八進制A S C I I代碼等價的控制字符
{ } 在定位行執行的命令組
n 從另外一個文件中讀文本下一行,並附加在下一行
g 將模式2粘貼到/pattern n/
y 傳送字符
n 延續到下一輸入行;容許跨行的模式匹配語句 app
例子
sed -n '2p' file.txt //打印第二行
sed -n '1,4p' file.txt //print 1-4 line
sed -n '1,$p' file.txt //print all 編輯器
sed -n '/require/'p cart.php /匹配require
sed -n '/$/'p cart.php /匹配$特殊字符 要用
sed -n '/.*uire/'p cart.php
sed -n -e '/require/p' -e '/require/=' cart.php //匹配require 而且打印行號
sed -n '/require/=' cart.php //只打印匹配的行號 工具
替換命令用替換模式替換指定模式,格式爲:
[ a d d r e s s [,address]] s/ pattern-to-find /replacement-pattern/[g p w n]
s選項通知s e d這是一個替換操做,並查詢p a t t e r n - t o - f i n d,成功後用r e p l a c e m e n t - p a t t e r n替
換它。
替換選項以下:
g 缺省狀況下只替換第一次出現模式,使用g選項替換全局全部出現模式。
p 缺省s e d將全部被替換行寫入標準輸出,加p選項將使- n選項無效。- n選項不打印輸出
結果。
w 文件名使用此選項將輸出定向到一個文件。 學習
sed 's/class/CLASS/' cart.inc 例如:
sed 's/class/CLASS/g' cart.inc //替換全部的匹配項目 測試
sed 's/class/CLASS/w cart.inc' out.file //替換後的結果輸出到 out.file中
sed '/require./r cart.php' 1.php //把cart.php文件中/require 後面的數據添加到1.php以前。
sed 's/##*//g' 1.php //把1.php文件中全部##替換成空格。
sed 's/^0*//g' 1.php //把行首的0設爲空。
sed 's/^M//g' 1.php //除去控制字符^M 鍵。
^M 的產生 ,<ctrl>+V 按J
^[[ 的產生 <ctrl>+V + 方向鍵 <-
處理報文輸出
1) 使用s/-*//g刪除橫線- - - - - -。
2) 使用/^$ / d刪除空行。
3) 使用$d刪除最後一行
4) 使用1d刪除第一行。
5) 使用awk {print $1}打印第一列。
命令以下,這裏使用了cat,並管道傳送結果到sed命令
cat cart.php |sed 's/--*//g' | sed '/^$/d' | sed '$d' | sed '1d' | awk '{print $1}'
快速一行命令
下面是一些一行命令集。([ ]表示空格, [ ]表示t a b鍵)
‘s / . $ / / g’ 刪除以句點結尾行
‘-e /abcd/d’ 刪除包含a b c d的行
‘s / [ ] [ ] [ ] * / [ ] / g’ 刪除一個以上空格,用一個空格代替
‘s / ^ [ ] [ ] * / / g’ 刪除行首空格
‘s / . [ ] [ ] * / [ ] / g’ 刪除句點後跟兩個或更多空格,代之以一個空格
‘/ ^ $ / d’ 刪除空行
‘s / ^ . / / g’ 刪除第一個字符
‘s /CO L ( . . . ) / / g’ 刪除緊跟C O L的後三個字母
‘s / ^ / / / g’ 從路徑中刪除第一個
‘s / [ ] / [ ] / / g’ 刪除全部空格並用t a b鍵替代
‘S / ^ [ ] / / g’ 刪除行首全部t a b鍵
‘s / [ ] * / / g’ 刪除全部t a b鍵
——————————————————————————————————
sed命令學習筆記收藏
http://victoryseason.blog.sohu.com/110677264.html
sed是源於行編輯器ed的非交互式的流(stream-oriented)編輯器。sed之因此稱爲「流」編輯器,是由於象大多數UNIX程序同樣,輸入流過它,而後被導向標準輸出。sed編輯器逐行處理文件(或輸入),把當前處理的行存儲在稱爲「模式空間」(pattern space)的臨時緩衝區中,接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。sed處理完一行後將其從模式空間中刪除,而後讀入下一行進行處理和輸出。sed是對文件副本進行編輯和修改,因此不用擔憂會修改或破壞原文件。sed主要用來自動編輯一個或多個文件,簡化對文件的反覆操做和編寫轉換程序等。
sed的使用格式以下:
sed [-n] [-e] ‘instruction’ file(s)
sed [-n] –f scriptfile file(s)
sed的instruction格式以下:
[address[,address]][!]command [arguments]
sed的主要選項有:
選 項 |
功 能 |
-n |
取消默認的輸出 |
-e |
容許多行編輯 |
-f |
指定sed腳本文件名 |
-i[SUFFIX] |
修改原文件,若是提供suffix,做備份 |
-r |
使用擴展正則表達式 |
sed指令能夠指定0、1或2個地址:
<!--[if !supportLists]-->0) <!--[endif]-->命令應用於全部行;
<!--[if !supportLists]-->1) <!--[endif]-->命令令應用於任何符合這一地址的行
<!--[if !supportLists]-->2) <!--[endif]-->命令應用與從第1個地址到第2個地址之間的行
sed的命令主要有:
命 令 |
功 能 |
d |
刪除行 |
p |
打印行 |
! |
對所選行以外的全部行應用命令 |
= |
打印行號 |
s |
替換命令(如’s/^west/north/g’)注意查找替換分隔符沒必要是’/’,而能夠是換行符和反斜線外的任何字符(如s#^west#north#g) |
r |
讀文件 |
w |
寫文件 |
a\ |
在當前行後添加一行或多行 |
i\ |
在當前行以前插入文本 |
c\ |
用新文本代替當前行中的文本 |
l |
顯示模式空間中的內容,顯示非打印字符爲兩字節ASCII碼 |
y |
將一字符轉換爲另外一字符(如:[address]y/abc/xyz/) |
n |
讀入下一行,並將其讀入模式緩衝區中,任何命令都將應用於下一行 |
q |
結束或退出sed |
D |
刪除多行pattern space中到\n爲止 |
N |
將下一行附加到上一行 |
P |
打印到多行pattern space的\n爲止 |
H(h) |
Hold命令,附加(H)或拷貝(h)pattern space的內容到hold space(暫存區) |
G(g) |
Get命令,附加(拷貝)暫存區的內容到pattern space |
x |
Exchange命令,互換hold space和pattern space的內容 |
b |
Branch(跳轉)命令([address]b[label]) |
t |
Test(測試)命令([address]t[label]) |
元字符 |
使 用 |
. |
除換行(\n)以外的任何字符 |
* |
匹配0或多個前導字符,至關於\{0,\} (如:/*love/) |
+ |
匹配1或多個前導字符,至關於\{1,\} 注意這是擴展元字符 |
[...] |
匹配指定字符組內的任一字符 (如:/[Ll]ove/ |
\{n,m\} |
匹配至少n個,至多m個前導字符;\{n\} 將匹配正好 n個, \{n,\}將匹配至少n個 (如:/o\{5,10\}) |
^ |
行首定位符 |
$ |
行尾定位符 |
\ |
取消轉義字符 |
\( \) |
保存已匹配的字符,最多可定義9個標籤(如:s/\(love\)able/\1er/) |
\n |
獲取以上獲取的第n個標籤 |
& |
保存查找串以便在替代串中引用 (如 s/love/**&**/g) |
\< |
詞首定位符 /\<love/ |
\> |
詞尾定位符 /love\>/ |
在命令行使用sed時經常會涉及到和shell的交互,而使用sed腳本則徹底沒必要要爲此操心。再也不用引號來確保sed命令不被shell解釋,並且可用反斜槓來續行。另外,對於腳本中的多個指令,應注意sed是對一行使用完了全部指令後再轉到下一行的。sed的這種選擇使得它能夠方便地處理大文件(沒必要將整個文件一次讀進內存)。另外,應注意sed對於腳本中輸入的命令很是挑剔,在命令的末尾不能有任何空白或文本,若是在一行中有多個命令,要用分號分隔。開始的{後不準有空格,結束的}必須單起一行。這一點與awk的比較自由的使用方式造成對比。sed中使用多行指令的示例以下:
/^\.TS/,/^\.TE/{ /^$/d s/^\.ps 10/.ps 8/ s/^\.vs 12/.vs 10/ }
sed如何使用shell變量?
好比在shell中定義了一個var變量,如何在sed中調用此變量?能夠考慮如下方法:
sed "s/mytext/$var/g" file
對於某些mytext這種方法可能不起做用。
sed 's/mytext/'$var'/g' file
(1)使用grep時,正則表達式沒有包含在//分隔符中,而sed須要包含在//之間;
(2)sed默認會輸出每一行,因此須要用-n命令阻止默認輸出;
(3)返回狀態。若是grep在文件中找到指定模式,將返回狀態0,不然返回1。sed則
不論是否找到指定模式,它的退出狀態都是0,只有命令存在語法錯誤時,sed的
退出狀態纔不是0。
sed爲何要設計得如此「麻煩」呢?初用者在想只輸出匹配行時每每忘記加-n選項。
這是由於sed首先是一個編輯器,而不是一個查找工具。好比當咱們須要替換文件的
一部分時能夠用不加-n選項的sed ‘s/a/b/g’ file實現。
Grep的經常使用命令語法1. 雙引號引用和單引號引用
在g r e p命令中輸入字符串參數時,最好將其用雙引號括起來。例如:」m y s t r i n g」。這樣作有兩個緣由,一是以防被誤解爲 s h e l l命令,二是能夠用來查找多個單詞組成的字符串,例如:」jet plane」,若是不用雙引號將其括起來,那麼單詞 p l a n e將被誤認爲是一個文件,查詢結果將返回」文件不存在」的錯誤信息。
在調用變量時,也應該使用雙引號,諸如: g r e p」$ M Y VA R」文件名,若是不這樣,將
沒有返回結果。
在調用模式匹配時,應使用單引號.[root@mypc ]# echo `grep 123 111.txt` (#注意是反單引號)
2. 經常使用的g r e p選項有:
-c 只輸出匹配行的計數。
-i 不區分大小寫(只適用於單字符)。
-h 查詢多文件時不顯示文件名。
-l 查詢多文件時只輸出包含匹配字符的文件名。
-n 顯示匹配行及行號。
-s 不顯示不存在或無匹配文本的錯誤信息。
-v 顯示不包含匹配文本的全部行。
3. 特殊的–在多個文件中進行查詢
$ grep 「sort」*.doc ( #在當前目錄下全部. d o c文件中查找字符串」s o r t」)
$ grep 「sort it」 * (#或在全部文件中查詢單詞」sort it」)
接下來的全部示例是指在單個文件中進行查詢
4. 行匹配
$ grep -c 「48″ data.f
$ 4 (#g r e p返回數字4,意義是有4行包含字符串」4 8″。)
$ grep 「48″ data.f (#顯示包含」4 8″字符串的4行文本)
5. 顯示知足匹配模式的全部行行數:
[root@mypc oid2000]# grep -n 1234 111.txt
1:1234
3:1234ab
6. 精確匹配
[root@mypc oid2000]# grep 「1234\>」 111.txt
1234
7. 查詢空行,查詢以某個條件開頭或者結尾的行。
結合使用^和$可查詢空行。使用- n參數顯示實際行數
[root@mypc oid2000]# grep -n 「^$」 111.txt (返回結果 2: #說明第二行是空行)
[root@mypc oid2000]# grep -n 「^abc」 111.txt (#查詢以abc開頭的行)
[root@mypc oid2000]# grep -n 「abc$」 111.txt (#查詢以abc結尾的行)
8. 匹配特殊字符,查詢有特殊含義的字符,諸如$ . ‘ 」 * [] ^ | \ + ? ,必須在特定字符前加\。
[root@mypc oid2000]# grep 「\.」 111.txt (#在111.txt中查詢包含」.」的全部行)
[root@mypc oid2000]# grep 「my\.conf」 111.txt (#查詢有文件名my. c o n f的行)
9. 目錄的查詢
[root@mypc oid2000]# ls -l |grep 「^d」 (#若是要查詢目錄列表中的目錄)
[root@mypc oid2000]# ls -l |grep 「^d[d]」 (#在一個目錄中查詢不包含目錄的全部文件)
[root@mypc]# ls -l |grpe 「^d…..x..x」 (#查詢其餘用戶和用戶組成員有可執行權限的目錄集合)
Awk的經常使用命令語法
awk命令擅長格式化報文或從一個大的文本文件中抽取數據包,下面是該命令的基本語法
awk [-F filed-separator] 「commands」 input-file(s)
[ - F域分隔符]是可選的,a w k使用空格做爲缺省的域分隔符,若是在要處理的文件中是以冒號做爲分割域的(如passwd文件),則在處理的時候要這樣指明 awk -F: command input-file(s)
1.1域和記錄
a w k執行時,其瀏覽域標記爲$ 1,$ 2 . . . $ n。這種方法稱爲域標識。使用$ 1 , $ 3表示參照第1和第3域,注意這裏用逗號作域分隔。若是但願打印一個有 5個域的記錄的全部域,沒必要指明 $ 1 , $ 2 , $ 3 , $ 4 , $ 5,可以使用$ 0,意即全部域。
1.2保存a w k輸出
$ awk ‘{print $0}’ input-files > out-files (#重定向保存輸出)
$ awk ‘{print $0}’ input-files | tee out-files (#使用t e e命令,輸出到文件的同時輸出到屏幕)
1.3 經常使用的awk命令舉例
[root@mypc /]# awk ‘$0 ~ /user/’ /etc/passwd (#若是某域含有user就將該行打印出來)
rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
[root@mypc /]# awk ‘/user/’ /etc/passwd (#同上)
[root@mypc /]# awk -F: ‘{if ($5 ~ /user/) print $0}’ /etc/passwd (#如第五域有user則輸出該行)
rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin
[root@mypc /]# ifconfig | awk ‘/inet/{print $2}’ (#從ifconfig的輸出中抽取含inet的行並打印第二域)
[root@mypc /]# ifconfig | awk ‘/inet/{print $2}’ | awk -F: ‘{print $2}’ (#在上面的基礎上再抽取,這個命令可讓你直接獲得本機的ip地址)
Sed的經常使用命令語法
Sed是一個非交互性文本流編輯器。它編輯文件或標準輸入導出的文本拷貝。
1.行的匹配
[root@mypc /]# sed -n ‘2p’ /etc/passwd 打印出第2行
[root@mypc /]# sed -n ‘1,3p’ /etc/passwd 打印出第1到第3行
[root@mypc /]# sed -n ‘$p’ /etc/passwd 打印出最後一行
[root@mypc /]# sed -n ‘/user/’p /etc/passwd 打印出含有user的行
rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
[root@mypc /]# sed -n ‘/\$/’p /etc/passwd 打印出含有$元字符的行,$意爲最後一行
2.插入文本和附加文本(插入新行)
[root@mypc /]# sed -n ‘/FTP/p’ /etc/passwd 打印出有FTP的行
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@mypc /]# sed ‘/FTP/ a\ 456′ /etc/passwd 在含有FTP的行後面新插入一行,內容爲456
[root@mypc /]# sed ‘/FTP/ i\ 123′ /etc/passwd在含有FTP的行前面新插入一行,內容爲123
[root@mypc /]# sed ‘/FTP/ i\ 「123″‘ /etc/passwd在含有FTP的行前面新插入一行,內容爲」123″
[root@mypc /]# sed ‘5 a\ 123′ /etc/passwd 在第5行後插入一新行,內容爲123
[root@mypc /]# sed ‘5 i\ 「12345″‘ /etc/passwd 在第5行前插入一新行,內容爲」12345″
3.刪除文本
[root@mypc /]# sed ‘1d’ /etc/passwd 刪除第1行
[root@mypc /]# sed ‘1,3d’ /etc/passwd 刪除第1至3行
[root@mypc /]# sed ‘/user/d’ /etc/passwd 刪除帶有user的行
4. 替換文本,替換命令用替換模式替換指定模式,格式爲:
[ a d d r e s s [,address]] s/ pattern-to-find /replacement-pattern/[g p w n]
[root@mypc /]# sed ’s/user/USER/’ /etc/passwd 將第1個user替換成USER,g代表全局替換
[root@mypc /]# sed ’s/user/USER/g’ /etc/passwd 將全部user替換成USER
[root@mypc /]# sed ’s/user/#user/’ /etc/passwd 將第1個user替換成#user,如用於屏蔽做用
[root@mypc /]# sed ’s/user//’ /etc/passwd 將第1個user替換成空
[root@mypc /]# sed ’s/user/&11111111111111/’ /etc/passwd 若是要附加或修改一個很長的字符串,可使用( &)命令,&命令保存發現模式以便從新調用它,而後把它放在替換字符串裏面,這裏是把&放前面
[root@mypc /]# sed ’s/user/11111111111111&/’ /etc/passwd 這裏是將&放後面
5. 快速一行命令
下面是一些一行命令集。([ ]表示空格,[ ]表示t a b鍵)
‘s / \ . $ / / g’ 刪除以句點結尾行
‘-e /abcd/d’ 刪除包含a b c d的行
‘s / [ ] [ ] [ ] * / [ ] / g’ 刪除一個以上空格,用一個空格代替
‘s / ^ [ ] [ ] * / / g’ 刪除行首空格
‘s / \ . [ ] [ ] * / [ ] / g’ 刪除句點後跟兩個或更多空格,代之以一個空格
‘/ ^ $ / d’ 刪除空行
‘s / ^ . / / g’ 刪除第一個字符
‘s /COL \ ( . . . \ ) / / g’ 刪除緊跟C O L的後三個字母
‘s / ^ \ / / / g’ 從路徑中刪除第一個\
‘s / [ ] / [ ] / / g’ 刪除全部空格並用t a b鍵替代
‘S / ^ [ ] / / g’ 刪除行首全部t a b鍵
‘s / [ ] * / / g’ 刪除全部t a b鍵
若是使用s e d對文件進行過濾,最好將問題分紅幾步,分步執行,且邊執行邊測試結果。
經驗告訴咱們,這是執行一個複雜任務的最有效方式。
[root@localhost ~]# nl test.txt
1 hahahaha
2 aaaaaaa
3 aaaaaaa
4 bbbbbbbbbbbbb
5 vvvvvvvv
6 ddddddddd
7 vvvvvvvv
8 aaaaaaa
9 bbbbbbbbbbbbb
10 ddddddddddd
11 $
12 #
13 345
14 345
15 a5^
[root@localhost ~]# nl test.txt | grep -vn "[1-9]"
4:
[root@localhost ~]#
nl 文件名
默認就會加行號顯示.空白行不加行號.
若是須要空白行也加行號能夠輸入
nl -b a 文件名
若是要自動把行號前面用0填充能夠
[root@localhost ~]# nl -n rz test.txt
000001 hahahaha
000002 aaaaaaa
000003 aaaaaaa
000004 bbbbbbbbbbbbb
000005 vvvvvvvv
000006 ddddddddd
000007 vvvvvvvv
000008 aaaaaaa
000009 bbbbbbbbbbbbb
000010 ddddddddddd
000011 $
000012 #
000013 345
000014 345
000015 a5^
[root@localhost ~]#
-w 後面能夠決定填充幾個0.能夠本身試試。。
nl -n rz -w 4 test.txt|grep -nv "^0"
因此這樣也能夠實現樓主要求