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)、一個或多個文件、或其它命令的輸出
vi與vim編輯器使用
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)vi與vim編輯器
一、vi 與vim 1.所有的 Unix Like 系統都會內建 vi 文字編輯器,其他的文字編輯器則不一定會存在;很多個別軟體的編輯介面都會主動呼叫 vi (例如未來會談到的crontab, visudo, edquota 等指令);vim 具有程式編輯的能力
word字型大小與公式編輯器字型對照表 如何批量修改word裡的公式
雙擊一個公式,開啟MathType,進入編輯狀態,點選size選單->define->字號對應的pt值,一般五號對應10pt,小四對應12pt其他可以自己按照具體要求自行調節。其他預設大小設定不推薦改動。然後點選preference->equation preference -> sa
linux GCC與Vi編輯器
最近在網上找了些視訊,自學了一點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