1. 程式人生 > >awk&sed入門(可程式設計過濾器awk與流編輯器sed)

awk&sed入門(可程式設計過濾器awk與流編輯器sed)

參考:李中國老師的課件

可程式設計過濾器awk

歷史

  略

awk: 為什麼叫做可程式設計過濾器 ?

  • awk 可以讀標準輸入並寫標準輸出 , 因此符合經典過濾
    器模式的程式定義
  • 但是 awk 與 grep,tr,wc,sort,uniq 等功能單一的過濾器程式的最大不同之處 , 是它的文字過濾功能需要通過使用者自己程式設計去實現 , 因此更加強大、豐富、靈活

準備資料:emp.data,分隔符為空格

Beth	4.00	0
Dan	3.75	0
Kathy	4.00	10
Mark	5.00	20
Mary	5.50	22
Susie	4.25	18

awk 可程式設計過濾器的五種使用方式

方式一
cat emp.data | awk '$3 > 0 { print $1, $2 * $3 } '


方式二
awk '$3 > 0 { print $1, $2 * $3 } ' emp.data
方式三
awk -f programfile emp.data
方式四
cat emp.data | awk -f programfile
方式五
chmod +x programfile
cat emp.data | ./programfile

./programfile emp.data


awk原始檔programfile: 注意第一行#! /usr/bin/awk -f

#! /usr/bin/awk -f
$3 > 0 { print $1, $2 * $3 }
#$3 > 0 {print $1,$2*$3}
#$3 > 0 {print $1, $2*$3} #$3 > 0 {print $1, $2* $3 } #$3 > 0 {print $1"\t"$2*$3}

awk 程式的基本結構

awk '模式 + { 動作 }'

只有動作:預設模式為匹配所有行
awk ’ { print $1 } ’ emp.data

只有模式:預設動作為列印匹配的行
awk ’ $3 == 0 ’ emp.data

awk 程式的特殊模式:

BEGIN

  在讀入檔案之前執行。

命令列

[[email protected] script]$ awk 'BEGIN {print "Name Rate Hours";print "" }{ print }'
emp.data Name Rate Hours Beth 4.00 0 Dan 3.75 0 Kathy 4.00 10 Mark 5.00 20 Mary 5.50 22 Susie 4.25 18

程式檔案
#注意:BEGIN 與 { 必須在同一行

[[email protected] script]$ cat programfile.sh 
#! /usr/bin/awk -f
BEGIN {	#注意:這裡的BEGIN 與 { 必須在同一行
	print "Name Rate Hours"
	print ""
}
{
	print
}
[[email protected] script]$ ./programfile.sh emp.data 
Name Rate Hours

Beth 4.00 0
Dan 3.75 0
Kathy 4.00 10
Mark 5.00 20
Mary 5.50 22
Susie 4.25 18

END

  在讀完檔案之後執行。
#注意:END與 { 必須在同一行

[[email protected] script]$ cat programfile.sh 
#! /usr/bin/awk -f
$3>15{emp=emp+1}	#每個符號之間可以有空格  $3 > 15 { emp = emp + 1 }
END {	#注意:END與 { 必須在同一行
	print emp, "employess worked more than 15 hours"
}
[[email protected] script]$ ./programfile.sh emp.data 
3 employess worked more than 15 hours

awk 程式的特殊變數: NR 與 NF

  • NR: 記錄當前行號
  • NF: 當前行內欄位數
  • $0: 當前整行的內容
  • F: 指定分隔符
[[email protected] script]$ awk '{print NR, $0}' emp.data 
1 Beth 4.00 0
2 Dan 3.75 0
3 Kathy 4.00 10
4 Mark 5.00 20
5 Mary 5.50 22
6 Susie 4.25 18
[[email protected] script]$ cat programfile.sh 
#! /usr/bin/awk -f
{print NR, $0}
$ ./programfile.sh emp.data

  計算某檔案有多少個字元:
思考:程式中為什麼要+1?

[[email protected] script]$ cat programfile.sh 
#! /usr/bin/awk -f
{	nc=nc+=length($0) + 1
	nw=nw+NF
}
END {
	print NR, "lines,", nw, "words,", nc, "characters"
}
[[email protected] script]$ ./programfile.sh emp.data 
6 lines, 18 words, 77 characters

  -F 指定分隔符的使用方式

[[email protected] ~]$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

[[email protected] ~]$ cat /etc/passwd | awk -F : 'BEGIN {print "name\tshell"} {print $1","$7} END {print "blue,/bin/nosh"}'
name	shell
root,/bin/bash
bin,/sbin/nologin
daemon,/sbin/nologin
adm,/sbin/nologin
......
blue,/bin/nosh

awk 控制結構

  與 C 語言一樣 ,awk 支援 if 語句、 for 迴圈、 while 迴圈等控制語句 ( 具有相同的語法 ):

  將負數轉成正數顯示:

[[email protected] script]$ cat programfile.sh 
#! /usr/bin/awk -f
{
	for (i = 1; i <= NF; i = i + 1){
		if ($i < 0) 
			$i = -$i
	}
	print
}

或者

[[email protected] script]$ cat programfile.sh 
#! /usr/bin/awk -f
{	for (i = 1; i <= NF; i = i + 1) if ($i < 0) $i = -$i
	print
}

awk 陣列

  將檔案內容,按每一行倒敘顯示:

[[email protected] script]$ cat programfile.sh 
#! /usr/bin/awk -f
{ line[NR]=$0}
END { for (i=NR; i>0; i=i-1)
	print line[i]
}
[[email protected] script]$ ./programfile.sh emp.data 
Susie 4.25 18
Mary 5.50 22
Mark 5.00 20
Kathy 4.00 10
Dan 3.75 0
Beth 4.00 0


流編輯器sed

簡介

  • sed = stream editor
  • 流編輯器 sed
    • 它編輯的物件通常是 Unix 管道中的文字流 , 故名
    • 誕生於 1973 – 1974 年 , 發明人是貝爾實驗室的 LeeE. McMahon ( 畢業於哈佛大學 )
    • 常常作為過濾器應用於管道之中 , 實現對文字的自動編輯處理 ; 與 awk 類似 , 其編輯功能同樣是可程式設計的(programmable)
  • sed 是標準的過濾器模式的程式
    • … | sed ‘s/xxx/yyy/g’ | …

替換命令 s

  sed 最基本、最重要的命令 s :文字替換
注意:

  • 無g 匹配到一塊後,停止這一行後面字串的匹配;
  • 有g 匹配所有的字串,即貪婪匹配;
  • 正則表示式及替換文字的分割符 / 可以換成其它符號;
  • 在被替換字串中 , 可以用符號 & 表示前面正則表示式匹配的內容;這一特性在進行文字替換時非常有用;
  • 在正則表示式及被替換字元換中,可用 \number 表示第幾個匹配的字串;匹配字串如需參加編號 , 則用 \( 和 \) 標誌:
  • 無-r引數,大括號、小括號 需要加轉義字元
  • 有-r 引數,可以省略 正則表示式中的轉義字元;

例1:

[[email protected] script]$ echo "123abc" | sed 's/[0-9][0-9]*/& &/'
123 123abc

例2:

[[email protected] script]$ cat input.txt 
2014-03-03,37.92,38.13,37.49,37.78,29717500,37.78
2014-03-04,37.93,38.14,37.50,37.77,29717500,37.78
2014-04-05,37.94,38.15,37.51,37.77,29717511,37.79
2014-04-06,37.95,38.16,37.52,37.76,29717511,37.79
[[email protected] script]$ cat input.txt | sed 's/,/\t/g' > output.txt
[[email protected] script]$ cat output.txt 
2014-03-03	37.92	38.13	37.49	37.78	29717500	37.78
2014-03-04	37.93	38.14	37.50	37.77	29717500	37.78
2014-04-05	37.94	38.15	37.51	37.77	29717511	37.79
2014-04-06	37.95	38.16	37.52	37.76	29717511	37.79

例3:

[[email protected] script]$ cat telephone.txt 
4000001476
4000000049
4000000041
4000002754
[[email protected] script]$ cat telephone.txt | sed 's/[0-9]\{3\}/(&)/'
[[email protected] script]$ cat telephone.txt | sed -r 's/[0-9]{3}/(&)/'
(400)0001476
(400)0000049
(400)0000041
(400)0002754

例4:

[[email protected] script]$ cat telephone.txt | sed 's/\([0-9]\{3\}\)\([0-9]\{3\}\)/\1-\2-/'
[[email protected] script]$ cat telephone.txt | sed -r 's/([0-9]{3})([0-9]{3})/\1-\2-/'
400-000-1476
400-000-0049
400-000-0041
400-000-2754

相關推薦

awk&sed入門(程式設計過濾器awk編輯sed)

參考:李中國老師的課件 可程式設計過濾器awk 歷史   略 awk: 為什麼叫做可程式設計過濾器 ? awk 可以讀標準輸入並寫標準輸出 , 因此符合經典過濾 器模式的程式定義 但是 awk 與 grep,tr,wc,sort,uniq 等功能單一的過濾器

CODE學習筆記七——自動操作3 : 程式設計定址跳轉

目錄 上回我們構造了一個可以自動進行加法操作,並且可以自動儲存的機器;雖然結構看上去很清晰,但是程式碼與資料分別存在兩個RAM中,在另一個角度看來是有些冗餘的;我們可以嘗試著把程式碼與資料共同存放在一個RAM裡,儘管在管理不當的情況下會造成比較嚴重的問題

程式設計渲染管線著色語言

轉自:http://www.cppblog.com/Leaf/archive/2013/02/22/198015.aspx Programming pipeline & shading language 大家好,今天想給大家介紹一下可程式設計渲染管線和著

第十九章 文本處理編輯awk編程

並不是 文本 取模 用戶自定義函數 taf linu man align 邏輯運算 第十九章 文本處理流編輯器:awk編程 名詞解釋 awk 是一種編程語言,用於linux/unix下對文本和數據進行處理。數據可以來自標準輸入(stdin)、一個或多個文件、或其它命令的輸出

vivim編輯使用

vim 升級 能力 字體 files mil style vi編輯器 class vi與vim1.介紹:   vi編輯器是所有Unix及Linux系統下標準的編輯器,他就相當於windows系統中的記事本一樣,它的強大不遜色於任何最新的文本編輯器。他是我們使用Linux系統

linux中行編輯sed的基本用法

sed的基本用法linux中行編輯器sed的基本用法sed的處理方法默認逐行讀取文件到內存中---->把符合模式的行讀取到屬於sed的內存中(sed的模式空間)進行編輯---->將處理後模式空間的內容顯示到屏幕上sed:行編輯器,默認不編輯源文件,僅對模式空間中的數據進行處理顯示使用方法sed [

sed編輯

表達 address 指定 pos root 模式 nbsp oot div sed默認不編輯源文件,僅對模式空間中的數據做處理;而後,處理結束後,將模式空間中的內容打印至屏幕。sed ‘AddressCommand‘ file... 用行,和命令一起來操作文本 Ad

使用C#的Conditional特性Unity編輯宏命令做條件編譯

運行時 符號 unit log edit ext 通過 space 編譯 概要 在傳統的C#項目中,用Conditional特性做條件編譯時,需要在Visual Studio中項目的屬性裏添加上條件編譯符號,用法參考這篇文章。 而在Unity項目中,條件編譯符號需要在Uni

P-R曲線mAP編輯

reference:http://blog.csdn.NET/marising/article/details/6543943 在資訊檢索、分類體系中,有一系列的指標,搞清楚這些指標對於評價檢索和分類效能非常重要,因此最近根據網友的部落格做了一個彙總。 準確率

sed:輕量級編輯

alt 新增 追加 替換 內容 插入 範圍 技術 文件名 一. sed命令 sed是一種幾乎包括在所有UNIX平臺(包括Linux)的輕量級流編輯器。sed主要是用來將數據進行選取、替換、刪除、新增的命令 註意:vi命令只能修改文件,但不能修改命令的結果,如修改df結果

week2(4)vivim編輯

一、vi 與vim 1.所有的 Unix Like 系統都會內建 vi 文字編輯器,其他的文字編輯器則不一定會存在;很多個別軟體的編輯介面都會主動呼叫 vi (例如未來會談到的crontab, visudo, edquota 等指令);vim 具有程式編輯的能力

word字型大小公式編輯字型對照表 如何批量修改word裡的公式

雙擊一個公式,開啟MathType,進入編輯狀態,點選size選單->define->字號對應的pt值,一般五號對應10pt,小四對應12pt其他可以自己按照具體要求自行調節。其他預設大小設定不推薦改動。然後點選preference->equation preference -> sa

linux GCCVi編輯

最近在網上找了些視訊,自學了一點Linux環境下,C程式設計的方法。 注 vi與vim是有區別的,vim開啟的原始碼檔案其中的關鍵字是有顏色的。 vi編輯器有3種模式,命令列模式,插入模式,底行模式。 如果是第一次使用vi,建議自學操作一邊這樣學的會牢些。在Linux終端裡直接輸入vim

Shell指令碼vi編輯

vi簡介 vi是一種廣泛存在於各種UNIX和Linux系統中的文字編輯程式。 vi不是排版程式,只是一個純粹的文字編輯程式。 vi是全螢幕文字編輯器,它沒有選單,只有命令。 vi不是基於視窗的,這個

word字型大小公式編輯字型對照表

字型大小對照表如下 初號44pt 小初36pt 一號26pt 小一24pt 二號22pt 小二18pt 三號16pt 小三15pt 四號14pt 小四12pt 五號10.5pt 小五9pt 六號7.5pt 小六6.5pt 七號5.5pt 八號5pt 修改方法: 選中公式雙擊進

Vim編輯Shell編輯

文本 否則 xxx 操作 解釋 腳本 刪除 進入 編輯 Vim文本編輯器(對應配置文件,多著色功能)Vim編輯器模式:命令模式、輸入模式、末行模式;命令模式用ESC鍵在輸入和末行模式之間切換,但末行與輸入不能直接進行切換;進入輸入模式可以用a、i、o鍵;進入末行模式用:鍵

文本處理工具之SED編輯

fstab文件 屏幕 編輯器 常用 多行模式 表達式 重定向 等價 內容 文本處理三劍客之SED(流編輯器) sed的工作方式:在指定文件中,按行讀取內容至模式空間,然後根據sed的scripts編輯改行內容,編輯完畢後輸出至屏幕,再讀取下一行進行處理。如果有該行內容未被處

awk 新手入門筆記

and count tin 顯示 使用 border date 用法 $1 轉自:http://www.habadog.com/2011/05/22/awk-freshman-handbook/ awk新手入門筆記 @作者 : habadog@郵箱 : [email&#

awk && sed (4)====linux 三劍客之awk 命令

awkhttp://www.cnblogs.com/ginvip/p/6352157.html這是我發現的一篇博客,關於awk 的內容寫的很好,需要的可以看看awk 關於!號(1)取奇數行[root@localhost shell]# seq 10 | awk ‘i=!i‘13579(2)取偶數行[root@

AWK 快速入門

roc done etc process i/o n-2 刷新 編程語言 分隔符 AWK:解釋型的編程語言 ,文本處理 輸出格式化的文本報表 執行算數運算 執行字符串操作$ awk --helpUsage: awk [POSIX or GNU style option