1. 程式人生 > >初識sed 和gawk

初識sed 和gawk

在shell指令碼中處理任何型別的資料,使用 sed gwak

自動的處理文字檔案中的文字。。

=====

sed編輯器:

又稱作流編輯器( stream editor ),跟普通互動式文字編輯器恰好相反。在互動式編輯器如(vim)裡,你可以使用鍵盤命令來互動式插入,刪除或者替換資料中的文字。劉編輯器則會在編輯器處理資料之前基於預先提供的一組規則來編輯資料流。。

sed編輯器可以基於輸入到命令列的或是儲存在命令文字檔案中的命令來處理資料流中的資料。  它每次從輸入中讀取一行,用提供的編輯器命令 匹配資料,按命令中指定的方式修改流中的資料,然後將生成的資料輸出到stdout。   在 流編輯器 將所以命令與一行資料進行匹配後,他會讀取下一行命令並重復這個過程。。在流編輯器將流中的所有資料處理完後,它就會終止。。

所以,命令都是一行一行的,而且必須一次就完成對文字的修改,所以速度快。。

sed格式:

sed options script file

options:

-e script 在處理輸入時,將script中指定的命令新增到執行的命令中

-f file 在處理輸入時,將file中指定的命令新增進執行的命令中

-n  不要為每個命令生成輸出,等待print命令來輸出。。

script引數指定了將作用在流資料上的單個命令。如果需要用多個命令,你必須用-e 選項來在命令列上指定他們,或用-f 選項來在單獨的檔案中指定。有大量的命令可以用來處理資料。

----------

1.在命令列使用sed

預設情況下,sed編輯器會將指定的命令應用到stdin輸入流。

[[email protected] shell]$ echo "this is a test" | sed 's/test/sed test/'
this is a sed test
[[email protected] shell]$ 

在這裡,我使用了管道, sed裡,使用s命令:s/aa/bb/  用bb替換所有的aa

[[email protected] shell]$ cat testfile 
this is the first line
This is a test
ond line 
this is the third line
this is the end line
[
[email protected]
shell]$ sed 's/this/that/' testfile that is the first line This is a test ond line that is the third line that is the end line [[email protected] shell]$
速度很快的。
[[email protected] shell]$ cat testfile 
this is the first line
This is a test
ond line 
this is the third line
this is the end line
[[email protected] shell]$ sed 's/this/that/' testfile
that is the first line
This is a test
ond line 
that is the third line
that is the end line
[[email protected] shell]$ cat testfile 
this is the first line
This is a test
ond line 
this is the third line
this is the end line
[[email protected] shell]$ 

可以看到這樣做對原檔案沒有影響。。。sed只會將修改後的資料傳送到stdout裡。。

現在我想在命令列裡使用多個sed語句:

使用-e選項

sed -e 's/bra/under/;s/asd/er/' file

[[email protected] shell]$ cat testfile 
this is the first line
This is a test
ond line 
this is the third line
this is the end line
[[email protected] shell]$ sed -e 's/this/that/; s/is/are/' testfile 
that are the first line
Thare is a test
ond line 
that are the third line
that are the end line
[[email protected] shell]$ 

命令之間用;號分隔,頭跟尾部不要有空格

當然你也可以使用shell中的次提示符:>      而不用使用分號;

[[email protected] shell]$ sed -e '
> s/this/that/
> s/is/are/
> '
testfile
testfile





注意一定要在‘ 號那行結束命令。。bash shell一旦現封尾的單引號。。

所以上面是錯誤的

[[email protected] shell]$ sed -e '
> s/th/aa/
> s/is/yu/
> ' testfile
aayu is the first line
Thyu is a test
ond line 
aayu is the third line
aayu is the end line
[[email protected] shell]$ 

這樣才行。。。。

=======

從檔案中讀取編輯命令

也就是將好多sed處理的命令放在在一個檔案裡。

[[email protected] shell]$ cat sedd
s/this/that/
s/is/are/
[[email protected] shell]$ 

就是這麼隨意。。  命令的結束也沒有分號。。

然後: sed -f sedd testfile

[[email protected] shell]$ cat sedd
s/this/that/
s/is/are/
[[email protected] shell]$ sed -f sedd testfile 
that are the first line
Thare is a test
ond line 
that are the third line
that are the end line
[[email protected] shell]$ 

=========

先介紹一下:gawk

它能提供一個類程式設計環境,允許修改和重新組織檔案中的資料,比sed高階些。。

來源於unix中的原始awk程式的GNU版本。。。gawk讓流編輯器邁上了一個新的臺階,不再只是有命令處理,而是一種程式語言。。。。。

大量運用於生成報告,格式化日誌檔案。。

gawk options program file

options:

-F fs  指定行中分隔資料欄位的欄位分隔符

-f file  指定讀取程式的檔名

-v var=value   定義 gawk程式中的一個變數及其預設值

-mf N  指定要處理中的檔案中最大欄位數

-mr N  指定資料檔案中的最大資料行數

-W keyword  指定gawk的相容模式或警告等級

----------

從命令列中使用gawk:

需要使用花括號{  裡面放命令 }  '  把{}包起來 '

當你: gawk '{print "hello oh"}'

print是gawk的內建命令

如果只是這樣執行的話,gawk會一直等待從stdin的輸入,直到你發出個訊號說,流已經結束了:EOF:end-of-file

鍵盤按  Ctrl+d

[[email protected] shell]$ gawk '{print "hello oh"}'
oh
hello oh
hi
hello oh
aaaaaa
hello oh
[[email protected] shell]$ 

---

使用資料欄位變數:

對於一個文字中的資料,gawk會自動給每行中的每個元素分配一個變數。預設情況下,變數會如下分配:

$0  代表整個文字行

$1  文字行中的第一個資料欄位

$2   文字行中的第二個資料欄位

$n  文字行中的第n個數據欄位

而欄位由欄位分隔符來劃分。。

也就是說,對gawk會依行處理文字中的資料,預設的欄位分隔符是任意的空白字元(如空格或製表符)

[[email protected] shell]$ cat tf
this is the first line
This is a test
ond line 
this is the third line
this is the end line
[[email protected] shell]$ gawk '{print $1}' tf
this
This
ond
this
this
[[email protected] shell]$ 

[[email protected] shell]$ cat tf
this is the first line
This is a test
ond line 
this is the third line
this is the end line
[[email protected] shell]$ gawk '{print $1}' tf
this
This
ond
this
this
[[email protected] shell]$ gawk '{print $0}' tf
this is the first line
This is a test
ond line 
this is the third line
this is the end line
[[email protected] shell]$ gawk '{print $1}' tf
this
This
ond
this
this
[[email protected] shell]$ 

可以看到輸出了整個檔案的第N個欄位

gawk -F: '{print $1}' /etc/passed

指定了分隔符為:    -F:

[[email protected] shell]$ gawk -F: '{print $1}' /etc/passwd
root
bin
daemon
adm
。。。
nfsnobody
abrt
gdm
tomcat
webalizer
sshd
mysql
tcpdump
oprofile
oh
[[email protected] shell]$ 

執行多條命令:

使用分號  或是>

[[email protected] shell]$ echo "my name is oh" | gawk '{$4="hhh"; print $0}' 
my name is hhh
[[email protected] shell]$ gawk '{
> $4="ohhh"
> print $0}'
kkdfkds sjfksj sjfsklf  fsfls//我輸入的
kkdfkds sjfksj sjfsklf ohhh//它輸出的
ksjfkljj jj jj jj//我輸入的
ksjfkljj jj jj ohhh//它輸出的
o o o o//我輸入的
o o o ohhh//它輸出的
[[email protected] shell]$ 

-------

將命令寫在檔案中:

cat asd:

{

test="oh oh "

print $1 test $6

}

使用:   gawk -F: -f asd /etc/passwd

無需使用$符號,, 一個花括號裡有好多的命令,不用;      另起一行就行。。。

-------

在處理資料前執行指令碼:

gawk 'BEGIN {print "hello world"}'

有時可能需要在處理資料前執行指令碼,比如為報告建立開頭的部分。。。BEGIN關鍵字就有這個功能。。

他會強制gawk在讀取資料前執行BEGIN關鍵字後指定的程式指令碼:

[[email protected] shell]$ gawk 'BEGIN {print "hello world"}'
hello world
[[email protected] shell]$ 

顯示了hello world後會快速退出而不用等待任何資料的輸入。。BEGIN關鍵字的那行gawk命令只用來顯示文字,

要處理資料的指令碼得在其它地方寫過。。。

[[email protected] shell]$ cat tf
this is the first line
This is a test
ond line 
this is the third line
this is the end line
[[email protected] shell]$ 

gawk 'BEGIN {print "the data4 file contents: "} {print $1}' tf

再用個{}寫  但是寫在‘’內

gawk 'BEGIN {print "the data4 file contents: "} {print $1}' tf
[[email protected] shell]$ gawk 'BEGIN {print "the data4 file contents: "} {print $1}' tf
the data4 file contents: 
this
This
ond
this
this
[[email protected] shell]$ 

---------

既然有裡BEGIN   那麼自然也有END 關鍵字了。。。。

END用於處理資料後再執行

[[email protected] shell]$ gawk 'BEGIN {print "the data4 file contents: "} {print $1} END {print "end of file"}' tf
the data4 file contents: 
this
This
ond
this
this
end of file
[[email protected] shell]$ 

一個小小的例子

[[email protected] shell]$ gawk -f script1 /etc/passwd
the latest list of users and shells
userid			shell
-----			-----
root			/bin/bash
bin			/sbin/nologin
daemon			/sbin/nologin
adm			/sbin/nologin
lp			/sbin/nologin
sync			/bin/sync
shutdown			/sbin/shutdown
halt			/sbin/halt
mail			/sbin/nologin
uucp			/sbin/nologin
operator			/sbin/nologin
games			/sbin/nologin
gopher			/sbin/nologin
ftp			/sbin/nologin
nobody			/sbin/nologin
dbus			/sbin/nologin
usbmuxd			/sbin/nologin
rpc			/sbin/nologin
rtkit			/sbin/nologin
avahi-autoipd			/sbin/nologin
vcsa			/sbin/nologin
apache			/sbin/nologin
haldaemon			/sbin/nologin
ntp			/sbin/nologin
saslauth			/sbin/nologin
postfix			/sbin/nologin
pulse			/sbin/nologin
rpcuser			/sbin/nologin
nfsnobody			/sbin/nologin
abrt			/sbin/nologin
gdm			/sbin/nologin
tomcat			/sbin/nologin
webalizer			/sbin/nologin
sshd			/sbin/nologin
mysql			/bin/bash
tcpdump			/sbin/nologin
oprofile			/sbin/nologin
oh			/bin/bash
this concludes the listing
[[email protected] shell]$ cat script1

BEGIN {
print "the latest list of users and shells"
print "userid			shell"
print "-----			-----"
FS=":"
}

{
print $1 "			"$7
}

END {
print "this concludes the listing"
}

[[email protected] shell]$ 

在script裡賦值一個叫FS變數  這是定義欄位分隔符的另一種方法。。。

可以看出,BEGIN  只在文字處理前執行一次。。。

END 只在文字執行後處理一次

中間的命令對每行都執行一次。。。

----------

回到sed編輯器:

 關於替換命令:s  就是substitute命令的簡寫。。但這也太簡了吧。。。。。

1.替換標記:

預設情況下只能替換匹配到的第一個字串。。

[[email protected] shell]$ echo "aa aa"|sed 's/aa/bb/'
bb aa
[[email protected] shell]$ 

要都替換掉的話,得使用替換標記(substitution flag)

s/pattern/replacement/flags

flag有四種:

數字:第幾處匹配的內容給替換掉。。

g:所有匹配到的內容

w file :將替換的結果寫到檔案中。。。

[[email protected] shell]$ echo "aa aa"|sed 's/aa/bb/'
bb aa
[[email protected] shell]$ echo "aa aa"|sed 's/aa/bb/2'
aa bb
[[email protected] shell]$ echo "aa aa"|sed 's/aa/bb/2 1'
sed: -e expression #1, char 11: multiple number options to `s' command
[[email protected] shell]$ echo "aa aa"|sed 's/aa/bb/2,1'
sed: -e expression #1, char 10: unknown option to `s'
[[email protected] shell]$ echo "aa aa"|sed 's/aa/bb/2;1'
sed: -e expression #1, char 11: missing command
[[email protected] shell]$ 
[[email protected]localhost shell]$ echo "aa aa"|sed 's/aa/bb/g'
bb bb

只輸出被替換過的行使用 p  加上sed的 -n選項   ;;  -n會禁止sed編輯器輸出。。但p   會輸出修改過的行。。。這一來,就可以只輸出被substitute命令修改過的行了

正常來說,sed的輸出是在stdout裡的。。。當你使用  w file    時,只有包含匹配模式的行才會儲存到指定的輸出檔案file裡。。

2.

替換一些尷尬的字元:

當你想替換正斜線時,可能會遇到一些問題,比較麻煩。。。

得使用\  

sed 's/\/etc/\/opt/' /etc/passwd

可讀性差。。。。

所以,使用!來替代原有的/    以!作為字串分隔符。

sed 's!/etc!/opt!' /etc/passwd

-------------

使用地址。。。

行定址(line addressing) 當你沒想匹配所有的行,而只是某些特定的行時。。

定址的方式有兩種:

1.行的數字範圍。。

2.用文字模式來過濾輸出的行。。。

兩種方式都是以下的命令方式:

[address] command

或者:

address {

command1

command2

command3

}

相關推薦

初識sed gawk

在shell指令碼中處理任何型別的資料,使用 sed gwak自動的處理文字檔案中的文字。。=====sed編輯器:又稱作流編輯器( stream editor ),跟普通互動式文字編輯器恰好相反。在互動式編輯器如(vim)裡,你可以使用鍵盤命令來互動式插入,刪除或者替換資料

shell高階-----初識sedgawk

sed編輯器 sed說明 sed是Linux下一款功能強大的非互動流式文字編輯器,可以對文字檔案進行增、刪、改、查等操作,支援按行、按欄位、按正則匹配文字內容,靈活方便,特別適合於大檔案的編輯。 sed使用方法 sed的使用方法,呼叫sed 命令的語法有兩種: 一.在命令列指定sed指令對文字進行處

sedgawk基礎

sed;sed編輯器;gawksed和gawk基礎

sedgawk

在一起 執行 寫入文件 成功 分號 重新 算術 作用 image   sed和gawk是shell腳本中必須熟練掌握的兩個命令工具;這一節我們詳細掌握sed命令的用法; 1、文本處理   sed和gawk為Linux shell腳本下最常用的行編輯器;   1.1、s

day25--python初識對象

體系 elf 參數 必須 屬性字典 特征 汽水 end () 一、面向對象的定義   說到面向對象,我們先來看一下面向過程的定義:面向過程的程序設計的核心是過程(流水線式思維),過程即解決問題的步驟,面向過程的設計就好比精心設計好一條流水線,考慮周全什麽時候處理什麽東西。優

使用sedawk進行文本處理

腳本 get 效果 oracle -i acl 行處理 hive 符號 Shell這種腳本語言特點是,結果松散,場景復雜,針對於一些參數都有特殊意義。針對於大部分工程師而言,使用中的情況是你可能會經常忘記參數或其意義,使你不得不查閱man或網上尋求幫助。此篇文檔作用就是在自

sedawk的一些使用【轉載自http://blog.sina.com.cn/s/blog_6561ca8c0102we0o.html】

blog printf begin 文件中 字符串 filename hello 選項 sina 在linux中,awk和sed命令對於快速的文本編排非常靈活有用。對文本插入列的操作也可以使用sed或者awk命令來處理,下面簡單介紹: 如果想要在指定列前插入字符串RR,

初識集合泛型

1.8 聲明 編譯器 變化 泛型類 ise 個數 bre 重復元素 package com.oracle.Test; import java.util.ArrayList; import java.util.Collection; import java.util.It

初識繼承多態

指定 style pro over mic 沒有 nbsp 構造函數 順序 1.繼承:一個類可以使用另一個類的屬性和方法(成員)  1.1 子類繼承父類使用的符號是冒號  1.2 子類不能繼承父類的構造函數2.我們new子類構造的時候,到底發生了什麽?  2.1 調用子類構

sedawk之sed篇(含sed高級用法)

清空 pre 需要 amp 打印 多條 邏輯 help n) (原創文章,謝絕轉載~) sed(stream editor)和 awk 是linux環境下處理文本、數據的強大“利器”,sed對數據列的處理稍遜,awk則更似一門語言,control flow的語法基本和c語言

Linux sed awk的用法

tab鍵 $1 archive 文件 關鍵字 passwd 多行 commands 方式 sed用法: 原文鏈接:http://www.cnblogs.com/dong008259/archive/2011/12/07/2279897.html sed是一個很好的文件處

[J2EE基礎]初識JSPServlet

動作 響應 大小 ext 包括 mod bean 編輯 pop 近期須要用到J2EE,就開始學習與J2EE相關的知識了。 JSP是一種Javaserver端技術,它用於在網頁上顯示動態內容。 Tomcat相關知識 JSP的運行過程 JSP的頁面構

sedawk的用法以及區別

sed和awk sed主要處理“行問題”。 awk主要處理“列問題”。 sed實例:sed -n "2p" /file 輸出file文件中的第二行 awk實例:awk -F= ‘BEGIN{print "hello"}{print

使用sedawk取除最後兩個字段之外的字段

sed字符串示例為:/Users/yfan/Downloads/dsc20170801_jar/releases/com/netfinworks/ufs/ufs-client/ufs-client-2.0.0.jar需求:如果使用斜杠/作為分隔符的話,可能每個字符串的字段數不同,這時需要取 除了最後兩個字段外

grep、sedawk命令的簡單使用

grep、sed和awk命令的簡單使用 grep 命令選項意義-c匹配行的數量-i忽略大小寫-h查詢多文件時不顯示文件名-l只列出匹配的文件名,不列匹配行-n列出匹配行,並列出行號-s不顯示不存在或無匹配的錯誤信息-v顯示不包含匹配文本的所有行-w匹配整詞-r遞歸

linux筆記(28)sedawk的聯系及拓展

28sed練習題把/etc/passwd 復制到/root/test.txt,用sed打印所有行[root@localhost sed]# sed -n '1,$p' passwd打印test.txt的3到10行[root@localhost sed]# sed -n '3,10

ES6初識-ProxyReflect

mes target replace return index rep net reflect lac { let obj={ time:‘2017-03-11‘, name:‘net‘, _r:123 }; let monitor=new Proxy(obj,{ //

初識HTMLWEB標準

文字 www. pan 引用 情況 主頁 什麽 大於號 無法 初識HTML和WEB標準 什麽是 HTML? HTML 超文本標記語言的縮寫(Hyper Text Markup Language) HTML 並不是編程語言,而是一種標記語言(markup language)

初識VIM正則表達式

vim 正則表達式 1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限。 ~]# mkdir /home/tuser1 ~]# cp -r /etc/skel /home/tuesr1 ~]# chmod -R go-r

Linux 第19天 sed壓縮工具

ext 最後一行 exc -o xtra fig pat 生成 時間 Linux 第19天 sed和壓縮工具 時間: 20180806 目錄 壓縮解壓縮 gzip/gunzip/zcat bzip/bunzip/bzcat xz/unxz/xzcat zi