歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux 中awk和sed使用

Linux 中awk和sed使用

日期:2017/2/28 15:29:22   编辑:Linux教程

顯示文本文件myfile中第七行到第十五行中以字符%分隔的第一字段,第三字段和第七字段: awk -F % 'NR==7,NR==15 {printf 1 3 7}'

顯示文件myfile中的行號和第3字段: awk '{printf"%03d%s\n",NR,1}' myfile

顯示文本文件mydoc匹配(含有)字符串"sun"的所有行。 awk '/sun/{print}' mydoc

下面的示例顯示了內置變量和內置函數length()的使用: awk 'length(0)>80 {print NR}' myfile 該命令行將顯示文本myfile中所有超過80個字符的行號,在這裡,用0表示整個記錄(行),同時,內置變量NR不使用標志符''

作為一個較為實際的例子,我們假設要對UNIX中的用戶進行安全性檢查,方法是考察/etc下的passwd文件,檢查其中的passwd字段(第二字段)是否為"*",如不為"*",則表示該用戶沒有設置密碼,顯示出這些用戶名(第一字段)。我們可以用如下語句實現: #awk -F: '2=="" {printf("%s no password!\n",1' /etc/passwd 在這個示例中,passwd文件的字段分隔符是“:”,因此,必須用-F:來更改默認的字段分隔符,這個示例中也涉及到了內置函數printf的使用

累計銷售文件xs中的銷售金額(假設銷售金額在記錄的第三字段): awk >'BEGIN { FS=":";print "統計銷售金額";total=0} >{print 3;total=total+3;} >END {printf "銷售金額總計:%.2f",total}' sx (注:>是shell提供的第二提示符,如要在shell程序awk語句和awk語言中換行,則需在行尾加反斜槓\

awk函數的定義方法如下: function 函數名(參數表){ 函數體 }

sed -e 's/123/1234/' a.txt
將a.txt文件中所有行中的123用1234替換(-e表示命令以命令行的方式執行;參數s,表示執行替換操作)
# sed -e '3,5 a4' a.txt
將a.txt文件中的3行到5行之間所有行的後面添加一行內容為4的行(參數a,表示添加行,參數a後面指定添加的內容)
# sed -e '1 s/12/45/' a.txt
把第一行的12替換成45
sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir`
批量處理通過grep搜索出來的所有文檔,將這些文檔中所有的oldstring用newstring替換(-i參數表示直接對目標文件操作)
$ sed -n 's/^test/mytest/p' example.file
(-n)選項和p標志一起使用表示只打印那些發生替換的行。也就是說,如果某一行開頭的test被替換成mytest,就打印它。(^這是正則表達式中表示開頭,該符號後面跟的就是開頭的字符串)(參數p表示打印行)
$ sed 's/^wangpan/&19850715/' example.file
表示被替換換字符串被找到後,被替換的字符串通過&符號連接給出的字符串組成新字符傳替換被替換的字符串,所有以wangpan開頭的行都會被替換成它自已加19850715,變成wangpan19850715
$ sed -n 's/\(love\)able/\1rs/p' example.file
love被標記為1,所有loveable會被替換成lovers,而且替換的行會被打印出來。需要將這條命令分解,s/是表示替換操作,\(love\)表示選中love字符串,\(love\)able/表示包含loveable的行,\(love\)able/\l表示love字符串標記為1,表示在替換過程中不變。rs/表示替換的目標字符串。這條命令的操作含義:只打印替換了的行
$ sed 's#10#100#g' example.file
不論什麼字符,緊跟著s命令的都被認為是新的分隔符,所以,“#”在這裡是分隔符,代替了默認的“/”分隔符。表示把所有10替換成100。
$ sed -n '/love/,/unlove/p' example.file
只打印包含love字符串行到包含unlove字符串行之間的所有行(確定行的范圍就是通過逗號實現的)
$ sed -n '5,/^wang/p' example
只打印從第五行開始到第一個包含以wang開始的行之間的所有行
$ sed '/love/,/unlove/s/$/wangpan/' example.file
對於包含love字符串的行到包含unlove字符串之間的行,每行的末尾用字符串wangpan替換。
字符串$/表示以字符串結尾的行,$/表示每一行的結尾,s/$/wangpan/表示每一行的結尾添加wangpan字符串
$ sed -e '11,53d' -e 's/wang/pan/' example.file
(-e)選項允許在同一行裡執行多條命令。如例子所示,第一條命令刪除11至53行,第二條命令用pan替換wang。命令的執行順序對結果有影響。如果兩個命令都是替換命令,那麼第一個替換命令將影響第二個替換命令的結果。(參數d,表示刪除指定的行)
$ sed --expression='s/wang/pan/' --expression='/love/d' example.file
一個比-e更好的命令是--expression。它能給sed表達式賦值。
$ sed '/wangpan/r file' example.file
file裡的內容被讀進來,顯示在與wangpan匹配的行後面,如果匹配多行,則file的內容將顯示在所有匹配行的下面。參數r,表示讀出文件,後面空格緊跟文件名稱
$ sed -n '/test/w file' example.file
在example.file中所有包含test的行都被寫入file裡。參數w,表示將匹配的行寫入到指定的文件file中
$ sed '/^test/a\oh! My god!' example.file
'oh! My god!'被追加到以test開頭的行的後面,sed要求參數a後面有一個反斜槓。
$ sed '/test/i\oh! My god!' example.file
'oh! My god!'被追加到包含test字符串行的前面,參數i表示添加指定內容到匹配行的前面,sed要求參數i後面有一個反斜槓
$ sed '/test/{ n; s/aa/bb/; }' example.file
如果test被匹配,則移動到匹配行的下一行,替換這一行的aa,變為bb。參數n,表示讀取匹配行的下一個輸入行,用下一個命令處理新的行而不是匹配行。Sed要求參數n後跟分號
$ sed '1,10y/abcde/ABCDE/' example.file
把1—10行內所有abcde轉變為大寫,注意,正則表達式元字符不能使用這個命令。參數y,表示把一個字符翻譯為另外的字符(但是不用於正則表達式)
$ sed -i 's/now/right now/g' test_sed_command.txt
表示直接操作文件test_sed_command.txt,將文件test_sed_command.txt中所有的now用right now替換。參數-i,表示直接操作修改文件,不輸出。
$ sed '2q' test_sed_command.txt

在打印完第2行後,就直接退出sed。參數q,表示退出
$ sed -e '/old/h' -e '/girl-friend/G' test_sed_command.txt
首先了解參數h,拷貝匹配成功行的內容到內存中的緩沖區。在了解參數G,獲得內存緩沖區的內容,並追加到當前模板塊文本的後面。上面命令行的含義:將包含old字符串的行的內容保存在緩沖區中,然後將緩沖區的內容拿出來添加到包含girl-friend字符串行的後面。隱含要求搜集到緩沖區的匹配行在需要添加行的前面。
$ sed -e '/test/h' -e '/wangpan/x' example.file
將包含test字符串的行的內容保存在緩沖區中,然後再將緩沖區的內容替換包含wangpan字符串的行。參數x,表示行替換操作。隱含要求搜集到緩沖區的匹配行在需要被替換行的前面。

Copyright © Linux教程網 All Rights Reserved