詳解流編輯器 sed 和 程式語言 awk
一、流編輯器 sed
選項 | -e | 連線多個編輯命令(直接在命令列模式上進行sed的操作) |
-f | 指定sed指令碼檔名(將sed的操作寫在一個檔案裡,用的時候 -f filename 就可以按照內容進行sed操作了) | |
-n | 阻止輸入行自動輸出(只有經過sed處理過的行才顯示出來,其他不顯示) |
-r 使之支援擴充套件正規表示式
sed ‘3q’ test.in
sed ‘s/public/PUBLIC/’ test.in
sed -n ‘s/public/PUBLIC/p’ test.in
1、用分號分隔命令
sed 's/public/PUBLIC/;s/north/NORTH/' test.in
2、每個命令前放置-e
sed -e 's/public/PUBLIC/' -e 's/north/NORTH/' test.in
3、使用分行命令功能,在輸入單引號後按return鍵就會出現多行提示符(>)
sed '
> s/public/PUBLIC/
> s/north/NORTH/' test.in
在指令碼中使用sed命令:
test.sed檔案內容如下:
s/public/PUBLIC/
s/north/NORTH/
sed -f test.sed test.in
n | 表示第 n 行 | |
$ | 表示最後一行 | |
m,n | 表示從第 m 行到第 n 行 | |
/pattern/ | 查詢包含指定模式的行。如 /disk/、/[a-z]/ | |
/pattern/,n | 表示從包含指定模式的行 到 第 n 行 | |
n,/pattern/ | 表示從第 n 行 到 包含指定模式的行 | |
/模式1/,/模式2/ | 表示從包含模式1 到 包含模式2的行 | |
! | 反向選擇,如 m,n!的結果與m,n 相反 |
sed '3q' test.in
p | 列印匹配行 | s | 替換命令 |
= | 顯示匹配行的行號 | l | 顯示指定行中所有字元 |
d | 刪除匹配的行 | r | 讀檔案 |
a\ | 在指定行後面追加文字 | w | 寫檔案 |
i\ | 在指定行前面追加文字 | n | 讀取指定行的下面一行 |
c\ | 用新文字替換指定的行 | q | 退出 sed |
awk 逐行掃描輸入 (可以是檔案或管道等),按給定的模式查詢出匹配的行,然後對這些行執行awk 命令指定的操作。
可以使用重定向將awk的輸出儲存到檔案中。
用法示 | ||
選項 | -F | 指定輸入記錄欄位的分隔符,預設使用環境變數IFS的值 |
-f | 從指定檔案讀取awk_script | |
-v | 為awk設定變數 |
The IFS is a special shell variable.
You can change the value of IFS as per your requirments.
The Internal Field Separator (IFS) that is used for word splitting after expansion and to split lines into words with the read builtin command.
The default value is <space><tab><newline>. You can print it with the following command:
cat -etv <<<"$IFS"
IFS variable is commonly used with read command, parameter expansions and command substitution.
awk -F: '{ print $1 }' /etc/passwd
awk -F: '{ print $1, $3 }' /etc/passwd // 輸出以空格連線
awk -F: '{ print $1 "|" $3 }' /etc/passwd // 輸出以 | 連線
awk -F: '/root/{ print $1 "|" $3 }' /etc/passwd
awk -F: '/^root/' /etc/passwd // 開頭是root 的行
(二)awk_script語法
注意BEGIN和END都是大寫字母
awk 'BEGIN {actions}
/pattern1/{actions}
......
/patternN/{actions}
END {actions}' input_file
其中BEGIN{actions}和 END{actions}是可選的
取出ip 地址:
ifconfig | awk '/inet addr/{ print $2 }' | awk -F: '{ print $2 }'
ifconfig | awk '/inet addr/{ print $2 }' | awk -F: 'BEGIN { print "begin..."} { print $2 } END { print "end..."} '
(四)模式匹配
① 使用正規表示式:/rexp/,如/^A/、/A[0-9]*/
^ | 只匹配行首 ( 可以看成是行首的標誌 ) |
$ | 只匹配行尾 ( 可以看成是行尾的標誌 ) |
* | 一個單字元後緊跟 *,匹配 0個或多個此字元 |
[ ] | 匹配 [] 內的任意一個字元 ([^]反向匹配 ) |
\ | 用來遮蔽一個元字元的特殊含義 |
. | 匹配任意單個字元 |
str1|str2 | 匹配 str1 或 str2 |
+ | 匹配一個或多個前一字元 |
? | 匹配零個或一個前一字元 |
( ) | 字元組 |
(五)欄位分隔符、重定向和管道
NR表示從awk開始執行後,按照記錄分隔符讀取的資料次數,預設的記錄分隔符為換行符,因此預設的就是讀取的資料行數,
NR可以理解為Number of Record的縮寫。
在awk處理多個輸入檔案的時候,在處理完第一個檔案後,NR並不會從1開始,而是繼續累加,因此就出現了FNR,
每當處理一個新檔案的時候,FNR就從1開始計數,FNR可以理解為File Number of Record。
NF表示目前的記錄被分割的欄位的數目,NF可以理解為Number of Field。
(六)更多awk
awk不僅是一個命令,它更是一個程式語言
變數
內部變數
awk ' {print NR,$0} ' #給檔案加上行號
自定變數
函式
內建函式
自定義函式
awk '{ print sum($1,$2) } function sum(x,y) { s=x+y ; return s }' grade.txt
陣列
awk 'BEGIN { print split("123#456",arr,"#") ; for (i in arr) { print arr[i] } }' // arr: 123 456
result="id 10 28 19 32"
data=(`echo $result | awk '{ for(i=2;i<=NF;i++) {print $i}}'`)
for task_id in ${data[@]}
do
done
參考:
《鳥哥的Linux私房菜基礎篇》
《高階bash shell程式設計指南》
http://www.grymoire.com/
相關文章
- awk sed 用法詳解
- 文字處理流編輯器sed命令用法大全
- julia語言編輯器
- SED單行指令碼快速參考(Unix 流編輯器)指令碼
- PureBasic 現代 BASIC 程式語言編輯器
- PureBasic for Mac(BASIC語言編輯器)MacC語言
- Linux三劍客Awk、Sed、Grep 命令詳解Linux
- Linux 三劍客 Awk、Sed、Grep 命令詳解Linux
- sed命令語法詳解
- Sed&awk筆記之awk篇:快速瞭解Awk(一)筆記
- 文字編輯器原始檔(java語言) (轉)Java
- 線上語言編輯器(js,css,html等多種語言支援)JSCSSHTML
- 效能工具之linux三劍客awk、grep、sed詳解Linux
- 通訊錄的c語言程式編輯C語言
- 用python語言寫程式有什麼好用的編輯器?Python
- 類Unix流編輯器sed線上極速入門 第三部分
- 類Unix流編輯器sed線上極速入門 第二部分
- awk指令碼語言程式設計指南指令碼程式設計
- 類Unix流編輯器sed線上極速入門 第一部分
- Linux三劍客grep、awk和sedLinux
- Linux編輯器vim鍵盤詳解Linux
- [linux]sed與awkLinux
- 《sed & awk》讀書筆記之 awk 篇筆記
- markdown編輯器語法
- 詳解 Go 語言的計時器Go
- 詳解Go語言的計時器Go
- Awk和Sed格式化Hive的資料Hive
- WordPress古騰堡編輯器和經典編輯器詳細對比,哪個好用?
- C/C++語言精髓 *和&詳解C++
- shell程式設計-sed命令詳解(超詳細)程式設計
- shell 中 grep、sed、awk 命令
- awk命令詳解
- Markdown 編輯器語法指南
- Linux基礎命令---文字編輯sedLinux
- 前端編輯器配置檔案EditorConfig詳解前端
- sed指令使用詳解
- sed命令使用詳解
- linux awk sed grep awk 求和平均最大最小Linux