Sed
讀入一行資料,與編輯的命令匹配,修改資料再輸出到
output
基本格式
sed options script file
-e
執行多個命令
-f
指定命令檔案,其中命令無須“
;
”分割
-n
禁止輸出,直到遇到
p flag
eg: sed -e 's/xx/xx/; s/xxx/xxx' data #
使用
;
,命令結尾與分號間無空格
sed
的命令
s,
預設僅替換首次出現的文本
s/pattern/replacement/flags
flags: g
替換全部;
p
列印原始行,與
-n
結合以輸出已修改行;
w filename
結果寫入到
filename
;數字,新文本替換的模式,如
2
表示替換第
2
處匹配
sed
中
/
用作轉義,
/
用作定界,也可選擇其他字元如“
!
”:
sed
's!/bin/bash!/bin/csh!' /etc/passwd
d,
刪除:
sed '3,$d' data
p,
i,
指定行之前插入新行
a,
指定行之後附加新行,這兩個命令必須單獨指定要插入或附加的行
eg: sed '[address]command /
#
必須使用
/
換行,多行則使用多個
/
new
line'
line addressing
行定址
使
sed
作用於特定行:
1)
指定行號方式,首行行號為
1
,
$
表示尾行:
sed '2,$s/dog/cat/' data1
2)
指定匹配模式方式,
/pattern/command
:
sed /'ri*/s/dog/cat/' data1
指定多個模式,使用“
,
”分隔:
sed '/1/,/3/d' data
#
sed
在匹配模式
/1/
時開啟刪除,直到匹配到模式
/3/
時關閉刪除
組合命令,對同一行執行多個命令:
sed
'2{s/dog/cat/; s/aaa/bbb/' data
sed
通常只處理單行文本,將成為處理跨行短語的限制,使用
N
、
D
、
P
等命令
gawk
基本格式
gawk options program file
-F fs
,指定用作資料分段的檔案分隔字元
field seperation character
-f file
,指定程式檔案名稱
-v var=value
,變數和預設值
-mf N
,要處理的欄位的最大數目
-mr N
,最大記錄大小
-W keyword
,相容模式或警示層級
gawk
指令碼由
{}
定義,必須放在單引號內,
gawk
假定指令碼為單文本字串
變數:
$0
整行文本,
$1
第一個欄位
eg: gawk -F: '{print $1}' /etc/passwd
多個命令,使用分號分開:
gawk '{$1="xxx"; print $0}'
#
可賦值,使用“
;
”分割多個命令
從檔案讀取程式:
檔案內容:
{print $5 "'s userid is
" $1};
$gawk -F: -f script /etc/passwd
指令檔:
script
{
text="'s
userid is "
#無須;
print
$5 test $1
#變數的使用無須
$
}
處理資料前
/
後運行指令碼
BEGIN/END
eg:
echo
adfdfadf|gawk 'BEGIN{print "begin:"}{print $0}END{print
"end"}'
變數:
1
)
FIELDWIDTHS
:用空格定義每個資料欄位的精確寬度,設定後將忽略
FS
,
eg:
'BEGIN{FIELDWIDTHS="2 3 1"}'
2
)
FS
變數,指定欄位分隔符號,
eg:
gawk 'BEGIN{FS=":"}'
3
)
RS
,指定記錄的分隔字元,預設為換行
4
)
OFS
,輸出欄位的分隔字元
5
)
ORS
,輸出記錄的分隔字元,預設為換行
6
)使用環境變數,
ENVIRON
[“
HOME
”],可使用任意環境變數
7
)
NF
,資料欄位個數,
$NF
最後一個資料欄位
8
)
FNR
,(當前檔案的)目前記錄號,
9
)
NR
,已處理記錄個數
使用Regex
必須出現在指令碼的左括弧前,用於匹配任何欄位符合該模式的記錄——這樣也可以使用
gawk
來直接定位行,無須
sed
?
eg:gawk 'BEGIN{FS=","}/11/{print
$1}' data1
matching operator
,使Regex匹配特定欄位
eg:gawk '$2~/11/{print $0}' data1
否定匹配,使用
!:
eg:gawk '$2!~/11/{print $0}' data1
使用數學運算式匹配,判斷符號包括
==
<=
<
>=
>
:
eg: '$4==0{print $0}'
#
不能用於字元
格式化輸出
printf "format
string",var1,var2...
eg: printf "result is
%d/n",x
#
不會自動換行,所以需要
/n
格式化控制符同
c
語音,包括
c/d/e/f/s/x
等
內建函數
eg:
gawk '{x="aasf";print
toupper(x)}' data