sed、awk工具

ed

sed意為流編輯器(Stream Editor),在Shell腳本和Makefile中作為過濾器使用非常普遍,也就是把前一個程序的輸出引入sed的輸入,經過一系列編輯命令轉換為另一種格式輸出。sed和vi都源于早期UNIX的ed工具,所以很多sed命令和vi的末行命令是相同的。

sed命令行的基本格式為

sed option 'script' file1 file2 ...

sed option -f scriptfile file1 file2 ...

選項含義:

--version ???????????? 顯示sed版本。

--help???????????????? 顯示幫助文檔。

-n,--quiet,--silent ?? 靜默輸出,默認情況下,sed程序在所有的腳本指令執行完畢后,將自動打印模式空間中的內容,這些選項可以屏蔽自動打印。

-e script ???????????? 允許多個腳本指令被執行。

-f script-file,

--file=script-file ??? 從文件中讀取腳本指令,對編寫自動腳本程序來說很棒!

-i,--in-place ???????? 直接修改源文件,經過腳本指令處理后的內容將被輸出至源文件(源文件被修改)慎用!

-l N, --line-length=N 該選項指定l指令可以輸出的行長度,l指令用于輸出非打印字符。

--posix ?????????????? 禁用GNU sed擴展功能。

-r, --regexp-extended 在腳本指令中使用擴展正則表達式

-s, --separate ??????? 默認情況下,sed將把命令行指定的多個文件名作為一個長的連續的輸入流。而GNU sed則允許把他們當作單獨的文件,這樣如正則表達式則不進行跨文件匹配。

-u, --unbuffered ????? 最低限度的緩存輸入與輸出。

以上僅是sed程序本身的選項功能說明,至于具體的腳本指令(即對文件內容做的操作)后面我們會詳細描述,這里就簡單介紹幾個腳本指令操作作為sed程序的例子。

a,? append ???????? 追加

i,? insert ???????? 插入

d,? delete ???????? 刪除

s,? substitution ?? 替換

如:$ sed "2a itcast" ./testfile 在輸出testfile內容的第二行后添加"itcast"。

$ sed "2,5d" testfile

sed處理的文件既可以由標準輸入重定向得到,也可以當命令行參數傳入,命令行參數可以一次傳入多個文件,sed會依次處理。sed的編輯命令可以直接當命令行參數傳入,也可以寫成一個腳本文件然后用-f參數指定,編輯命令的格式為:

/pattern/action

其中pattern是正則表達式,action是編輯操作。sed程序一行一行讀出待處理文件,如果某一行與pattern匹配,則執行相應的action,如果一條命令沒有pattern而只有action,這個action將作用于待處理文件的每一行。

常用sed命令

/pattern/p 打印匹配pattern的行

/pattern/d 刪除匹配pattern的行

/pattern/s/pattern1/pattern2/ 查找符合pattern的行,將該行第一個匹配pattern1的字符串替換為pattern2

/pattern/s/pattern1/pattern2/g 查找符合pattern的行,將該行所有匹配pattern1的字符串替換為pattern2

使用p命令需要注意,sed是把待處理文件的內容連同處理結果一起輸出到標準輸出的,因此p命令表示除了把文件內容打印出來之外還額外打印一遍匹配pattern的行。比如一個文件testfile的內容是

123

abc

456

打印其中包含abc的行

$ sed '/abc/p' testfile

123

abc

abc

456

要想只輸出處理結果,應加上-n選項,這種用法相當于grep命令

$ sed -n '/abc/p' testfile

abc

使用d命令就不需要-n參數了,比如刪除含有abc的行

$ sed '/abc/d' testfile

123

456

注意,sed命令不會修改原文件,刪除命令只表示某些行不打印輸出,而不是從原文件中刪去。

使用查找替換命令時,可以把匹配pattern1的字符串復制到pattern2中,比如:

$ sed 's/bc/-&-/' testfile

123

a-bc-

456

pattern2中的&表示原文件的當前行中與pattern1相匹配的字符串

再比如:

$ sed 's/\([0-9]\)\([0-9]\)/-\1-~\2~/' testfile

-1-~2~3

abc

-4-~5~6

pattern2中的\1表示與pattern1的第一個()括號相匹配的內容,\2表示與pattern1的第二個()括號相匹配的內容。sed默認使用Basic正則表達式規范,如果指定了-r選項則使用Extended規范,那么()括號就不必轉義了。如:

sed -r 's/([0-9])([0-9])/-\1-~\2~/' out.sh

替換結束后,所有行,含有連續數字的第一個數字前后都添加了“-”號;第二個數字前后都添加了“~”號。

可以一次指定多條不同的替換命令,用“;”隔開:

$ sed 's/yes/no/;s/static/dhcp/' ./testfile

注:使用分號隔開指令。

也可以使用 -e 參數來指定不同的替換命令,有幾個替換命令需添加幾個 -e 參數:

$ sed -e 's/yes/no/' -e 's/static/dhcp/' testfile

注:使用-e選項。

如果testfile的內容是

<html><head><title>Hello World</title></head>

<body>Welcome to the world of regexp!</body></html>

現在要去掉所有的HTML標簽,使輸出結果為:

Hello World

Welcome to the world of regexp!

怎么做呢?如果用下面的命令

$ sed 's/<.*>//g' testfile

結果是兩個空行,把所有字符都過濾掉了。這是因為,正則表達式中的數量限定符會匹配盡可能長的字符串,這稱為貪心的(Greedy)。比如sed在處理第一行時,<.*>匹配的并不是<html>或<head>這樣的標簽,而是

<html><head><title>Hello World</title>

這樣一整行,因為這一行開頭是<,中間是若干個任意字符,末尾是>。那么這條命令怎么改才對呢?留給同學們思考練習。

awk

sed以行為單位處理文件,awk比sed強的地方在于不僅能以行為單位還能以列為單位處理文件。awk缺省的行分隔符是換行,缺省的列分隔符是連續的空格和Tab,但是行分隔符和列分隔符都可以自定義,比如/etc/passwd文件的每一行有若干個字段,字段之間以:分隔,就可以重新定義awk的列分隔符為:并以列為單位處理這個文件。awk實際上是一門很復雜的腳本語言,還有像C語言一樣的分支和循環結構,但是基本用法和sed類似,awk命令行的基本形式為:

awk option 'script' file1 file2 ...

awk option -f scriptfile file1 file2 ...

和sed一樣,awk處理的文件既可以由標準輸入重定向得到,也可以當命令行參數傳入,編輯命令可以直接當命令行參數傳入,也可以用-f參數指定一個腳本文件,編輯命令的格式為:

/pattern/{actions}

condition{actions}

和sed類似,pattern是正則表達式,actions是一系列操作。awk程序一行一行讀出待處理文件,如果某一行與pattern匹配,或者滿足condition條件,則執行相應的actions,如果一條awk命令只有actions部分,則actions作用于待處理文件的每一行。比如文件testfile的內容表示某商店的庫存量:

ProductA 30

ProductB 76

ProductC 55

打印每一行的第二列:

$ awk '{print $2;}' testfile

30

76

55

自動變量$1、$2分別表示第一列、第二列等,類似于Shell腳本的位置參數,而$0表示整個當前行。再比如,如果某種產品的庫存量低于75則在行末標注需要訂貨:

$ awk '$2<75 {printf "%s\t%s\n", $0, "REORDER";} $2>=75 {print $0;}' testfile

ProductA 30 REORDER

ProductB 76

ProductC 55 REORDER

可見awk也有和C語言非常相似的printf函數。awk命令的condition部分還可以是兩個特殊的condition-BEGIN和END,對于每個待處理文件,BEGIN后面的actions在處理整個文件之前執行一次,END后面的actions在整個文件處理完之后執行一次。

awk命令可以像C語言一樣使用變量(但不需要定義變量),比如統計一個文件中的空行數

$ awk '/^ *$/ {x=x+1;} END {print x;}' testfile

就像Shell的環境變量一樣,有些awk變量是預定義的有特殊含義的:

awk常用的內建變量

FILENAME ?? 當前輸入文件的文件名,該變量是只讀的

NR ???????? 當前行的行號,該變量是只讀的,R代表record

NF ???????? 當前行所擁有的列數,該變量是只讀的,F代表field

OFS ??????? 輸出格式的列分隔符,缺省是空格

FS ???????? 輸入文件的列分融符,缺省是連續的空格和Tab

ORS ??????? 輸出格式的行分隔符,缺省是換行符

RS ???????? 輸入文件的行分隔符,缺省是換行符

例如打印系統中的用戶帳號列表

$ awk 'BEGIN {FS=":"} {print $1;}' /etc/passwd

awk也可以像C語言一樣使用if/else、while、for控制結構。可自行擴展學習。

?

轉載于:https://www.cnblogs.com/wanghao-boke/p/11488553.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384834.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384834.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384834.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言正則表達式

POSIX規定了正則表達式的C語言庫函數&#xff0c;詳見regex(3)。我們已經學習了很多C語言庫函數的用法&#xff0c;讀者應該具備自己看懂man手冊的能力了。本章介紹了正則表達式在grep、sed、awk中的用法&#xff0c;學習要能夠舉一反三&#xff0c;請讀者根據regex(3)自己總結…

makefile通用版本

實際當中程序文件比較大&#xff0c;這時候對文件進行分類&#xff0c;分為頭文件、源文件、目標文件、可執行文件。也就是說通常將文件按照文件類型放在不同的目錄當中&#xff0c;這個時候的Makefile需要統一管理這些文件&#xff0c;將生產的目標文件放在目標目錄下&#xf…

Python3OS文件/方法

Python3OS文件/方法 os模塊提供了非常豐富的方法用來處理文件和目錄。 方法 描述 os.access(path,mode) 檢驗權限模式 os.chdir(path) 改變當前工作目錄 os.chflags(path,flags) 設置路徑的標記為數字標記 os.chmod(path,mode) 更改權限 os.chown(path,uid,gid) 更改…

Python3文件

open()方法 Python open()方法永于打開一個文件&#xff0c;并返回文件對象&#xff0c;并對文件進行處理過程中都需要用到這個方法&#xff0c;如果該文件無法被打開&#xff0c;則拋出OSError 注意&#xff1a;使用open()方法一定要保證關閉文件對象&#xff0c;即調用close(…

Python3輸入輸出

Python兩種輸出值的方式&#xff0c;表達式語句和print()函數。 第三種方式是使用文件對象的write()方法&#xff0c;標準輸出文件可以用sys.stdout的引用。 如果你希望輸出的形式更加多樣&#xff0c;可以使用str.fomat()函數來格式化輸出值。 如果你希望將輸出的值轉化成字符…

動態庫加載順序

1.編譯目標代碼時指定的動態庫搜索路徑&#xff1b; 2.環境變量LD_LIBRARY_PATH指定的動態庫搜索路徑&#xff1b; 3.配置文件/etc/ld.so.conf中指定的動態庫搜索路徑&#xff1b; 4.默認的動態庫搜索路徑/lib&#xff1b; 5.默認的動態庫搜索路徑/usr/lib。 轉載于:https://ww…

Python3正則表達式

正則表達式是一個特殊的字符序列&#xff0c;他能幫助你方便的檢查一個字符串是否與某種模式匹配。re.match函數 re.match嘗試從字符串的起始位置匹配一個模式&#xff0c;如果不是起始位置匹配成功的話&#xff0c;match()就返回一個none。 函數語法&#xff1a; re.match(pat…

C/C++輸入

fgets(str,n,stdin) 從鍵盤輸入一行&#xff0c;替代gets()。讀取到n-1字節時或換行符時終止&#xff0c;如果是文件的話&#xff0c;讀到文件結尾也會停止 getline(cin,str) str的類型必須是string類&#xff0c;它是C特定的字符串類&#xff0c;區別于C的char *數據類型。 ci…

strlen和sizeof的區別

C語言中沒有字符串&#xff0c;用的是字符數組來模擬字符串。 C風格的字符串時字符數組然后在末尾加0表示結尾。 在C語言中有strlen和sizeof兩個函數求字符數組的長度函數&#xff0c;他們倆的區別就是是否把最后的結束標志也加上去。 strlen是不加的&#xff0c;他表示字符串的…

shell編程練習題

求2個數之和計算1-100的和將一目錄下所有的文件的擴展名改為bak編譯當前目錄下的所有.c文件&#xff1a;打印root可以使用可執行文件數&#xff0c;處理結果: roots bins: 2306打印當前sshd的端口和進程id&#xff0c;處理結果: sshd Port&&pid: 22 5412輸出本機創建20…

shell編程題(一)

求2個數之和 #!/bin/bashfunction add {if(( $# < 2 )); thenecho "The arg int correct"elsesum$(($1$2))echo $sumfi }add 1 add 1 2 運行結果&#xff1a; exbotubuntu:~/shareWin/linux/shell$ ./sum.sh 1 2The arg int correct3 $#&#xff1a;相當于C語言…

vimset

vim ~./vimrc set nocompatible "去掉有關vi一致性模式&#xff0c;避免以前版本的bug和局限 set nu! "顯示行號 set guifontLuxi/ Mono/ 9 " 設置字體&#xff0c;字體名稱和字號 filetype on …

shell編程題(二)

計算1-100之和 #!/bin/bashsum0 for i in seq 1 100;do #符號不是單引號 是 1左邊的符號sum$[$i $sum ] done echo $sum #!/bin/bashi0 n1              #定義循環變量 while [ $n -lt 101 ];do  #循環變量小于101 i$(( $i $n))        #累加 n$(( …

vim命令大全

1. vim模式 正常模式&#xff08;按Esc或Ctrl[進入&#xff09; 左下角顯示文件名或為空 插入模式&#xff08;按i進入&#xff09; 左下角顯示--INSERT-- 可視模式&#xff08;按v進入&#xff09; 左下角顯示--VISUAL-- 替換模式&#xff08;按r或R開始&#xff09; 左下角顯…

signal()函數

函數原型 void (*signal(int sig,void(*func)(int)))(int); 指定使用sig指定的信號編號處理信號的方法。參數func指定程序可以處理信號的三種方式之一&#xff1a; l 默認處理(SIG_DFL)&#xff1a; 信號由該特定信號的默認動作處理l 忽略信號&#xff08;SIG_IGN&a…

setitimer()函數

定時器時間函數 struct itimerval&#xff1a;struct itimerval *new_value&#xff0c;其定義如下&#xff1a;struct itimerval {struct timeval it_interval; /*next value*/struct timeval it_value; /*current value*/};struct timeval {long tv_sec; /*seconds*/lonng t…

shell編程題(三)

將一目錄下所有的文件的擴展名改為bak #! /bin/bashfor i in ls domv $i ${i%%.*}.bak done ${i%%.*} 截掉一個變量字符串第一個"."以及其右側的所有字符&#xff0c;即最短前綴匹配。 #! /bin/bashdir./ #指定文件夾for file in $dir*.txt #指定文件夾下面文件類型…

VMware安裝VMwaretools

默認點擊“安裝VMware Tools&#xff08;T&#xff09;”選項下載好安裝包 下載的安裝包放在計算機的media目錄下 進入/media/ubuntu14-04/VMware Tools目錄&#xff1a; cd /media/ubuntu14-04/VMware Tools 將安裝包復制到tmp文件夾下&#xff1a; cp VMwareTools-10.0.5-322…

shell編程題(四)

編譯當前目錄下的所有.c文件 #!/bin/bashif [ $# -lt 1 ] ;then #如果輸入參數小于1則報錯 $# C語言中的argv[0] 輸入參數個數echo "Please follow up file.c!"echo "eg: ./make.sh xxx.c"exit fiif [[ $2 "debug" ]] ;then #如果第三個參數…

stat函數

int lstat(const char *path,struct stat*buf) 當文件是一個符號鏈接時&#xff0c;lstat返回的是該符號鏈接本身的信息&#xff0c;而stat返回的是該鏈接指向的文件的信息。 struct stat {dev_t st_dev; //設備號碼ino_t st_ino; //inode節點號mo…