2021-05-12 14:32:11
awk 字串與算數處理
2020-06-16 17:23:47
格式化輸出
awk提供兩個高階輸出函數printf和sprintf,他們提供了格式化輸出功能。
- printf函數將格式化字串列印到標準輸出(stdout)
- sprintf 函數則返回“可以賦值給變數的字串”
eg.
print.awk
# printf & sprintf
{
# 第一個欄位
x = $1
b ="foo"
# 格式化輸出
printf("%s got a %d on last testn","Jim",83)
# 將格式化的字串賦給變數
myout = sprintf("%s - %d", b, x)
# 簡單輸出,自帶換行
print myout
}
echo 100| awk -f print.awk
Jim got a 83 on last test foo - 100
格式化輸出支援的跳脫字元(格式說明符)
c ACII字元(char型)
s 字串
d 十進位制整數
ld 十進位制長整形
u 十進位制無符號整數
lu 十進位制無符號長整數
x 十六進位制整數
lx 十六進位制長整數
o 八進位制整數
lo 八進位制長整數
e 用科學計數法表示的浮點數
f 浮點數
g 選e/f中較短的一種
awk還支援一些修飾符,這些修飾符跟在‘%’後面,出現在格式說明符之前,可以規定輸出域的寬度和對齊方式。
printf的修飾符
- 左對齊修飾符
# 顯示8進位制數時在前面加個0;16進位制數時在前面加個0x
+ 顯示使用的d、e、f、g格式的整數時,前面加上正負號(+/-)
0 用0而不是空白來填充所顯示的值
格式說明符和修飾符的使用方法:
%-width.precision format-specifier
eg.
%10s // 預設右對齊; 10:輸出欄位的域長度至少10個字元,不夠10個,空白補齊;多餘10個時,原樣輸出
%-10s // 同上,- 表示輸出左對齊
%10.5f // 欄位輸出至少10個字元寬度;5-小數點後5位
字串函數
1. 子字串查詢
index(str,subsr) 返回子串subsr在串str中第一次出現的索引(起始位置),index函數位符串的開始位置為1.(C語言為0)
2. 子字串提取
substr(str,position[,length]) 返回str中position位置開始的length個字元;預設length時,返回positio位置開始的所有字元。
eg.
awk '{print substr($1,3)}' // 提取第一個域中從第三個字元起的所有字元
awk '{print substr($1,5,9)}' // 提取第一個域中從第5個字元起的後面9個字元
3. 字串匹配
match(string,/regexp/) 如果在string中找到匹配正則/regexp/的子字串,則返回子字串的起始位置,無法匹配,則返回0
區別: index()函數查詢固定字串的位置,match()支援正則匹配!
match()函數會影響兩個系統變數:
RSTART :執行match()後,被設定為匹配上正規表示式的子字串的起始位置。
RLENGTH:執行match()後,被設定為匹配上正規表示式的子字串的長度。
若無法匹配,RSTART被設定為0,RLENGTH被設定為-1。
4. 子字串替換
sub(regexp,replacement,target)
將target與正規表示式regrxp進行匹配,只替換匹配到的第一個字串;如果target沒有給定,則sub函數預設使用整個記錄。
gsub(regexp,replacement,target)
// gsub()函數替換所有匹配到的字串
5.大小寫轉換
tolower(string) 將輸入文字轉為小寫
toupper(string) 將輸入文字轉為大寫
6. 字串分割
split(string,array,regexp)字串分割函數
將string切割為片段,並儲存到陣列裡,分割字串時的分隔符由正則regexp指定,省略regexp時預設為FS(空格).
eg.1
[root@web1 test]# cat split.awk
# awk 字串分隔函數
{
print "nField seperator = FS " "FS" ""
n = split($0, array) // 預設使用 空格 為欄位分隔符
for(k =1; k <= n; k++) // split函數返回分割後的字串的個數
{
print "array[k] = " array[k]
}
}
[root@web1 test]# echo "dfssfs sdf dsf dsf "| awk -f split.awk
Field seperator = FS " "
array[k]= dfssfs
array[k]= sdf
array[k]= dsf
array[k]= dsf
eg.2
[root@web1 test]# cat split.awk
# awk 字串分隔函數
{
print "nField seperator = :"
n = split($0, array,":") // 指定分隔符為 ":"
for(k =1; k <= n; k++)
{
print "array[k] = " array[k]
}
}
[root@web1 test]# head -n2 /etc/passwd | awk -f split.awk
Field seperator =:
array[k]= root
array[k]= x
array[k]=0
array[k]=0
array[k]= root
array[k]=/root
array[k]=/bin/bash
Field seperator =:
array[k]= bin
array[k]= x
array[k]=1
array[k]=1
array[k]= bin
array[k]=/bin
array[k]=/sbin/nologin
split("",array) // 快速清空陣列
7. 字串重建
eg.1
[root@web1 test]# awk 'BEGIN{ s1 = "hello "; s2 = "ollir "; s = s1 s2 ; print s}'
hello ollir
[root@web1 test]# awk 'BEGIN{ s1 = "hello "; s2 = "ollir "; s = sprintf("%s%s",s1 ,s2); print s}'
hello ollir
算術函數
1.常用函數
三角函數sin()、cos() // 輸入引數為弧度角,不是30°之類的角度,要轉化為弧度
atan(x,y) // x,y範圍內的餘切
exp(x) // 以e為底數的指數
log() // 自然對數
sqrt() // 平方根
2.取整函數
int() 取實型數位的整數部分,直接忽略小數部分
eg.
print int(10.6)
10
3.亂數
rand() 生成一個0-1之間的浮點型亂數
srand(x)為亂數發生器設定一個種子,種子數值為x,如果x未傳入引數,則srand()函數將當前時間作為種子。
如果沒有呼叫srand()來設定隨機種子的話,awk在開始執行程式前預設以某個常數作為引數呼叫srand(),使得程式每次執行時都以同一個隨機種子開始,這樣使得所得的亂數序列每次執行都相同,這可以用於重複測試相同的操作。
eg.
[root@web1 test]# cat rand.awk
BEGIN {
# 沒有顯式呼叫srand()設定種子,awk使用預設常數作為引數傳入srand()設定固定的種子
print rand() // 亂數固定
print rand()
# srand()使用當前時間作為引數上設定種子
srand()
print rand() //亂數與當前時間有關
print rand()
}
{}
[root@web1 test]# echo ""| awk -f rand.awk
0.237788
0.291066
0.0421086
0.447394
[root@web1 test]# echo ""| awk -f rand.awk
0.237788
0.291066
0.874176
0.562551
Linux常用命令之awk http://www.linuxidc.com/Linux/2016-09/135046.htm
Linux系統之文字格式化工具awk http://www.linuxidc.com/Linux/2016-02/128150.htm
AWK簡介及使用範例 http://www.linuxidc.com/Linux/2013-12/93519.htm
Linux awk文字分析工具 http://www.linuxidc.com/Linux/2015-12/126217.htm
Linux文字處理工具之awk http://www.linuxidc.com/Linux/2015-01/111437.htm
如何在Linux中使用awk命令 http://www.linuxidc.com/Linux/2014-10/107542.htm
文字分析工具-awk http://www.linuxidc.com/Linux/2014-12/110939.htm
AWK入門基礎教學 http://www.linuxidc.com/Linux/2016-12/138138.htm
使用awk格式化輸出文字 http://www.linuxidc.com/Linux/2016-04/130193.htm
本文永久更新連結地址:http://www.linuxidc.com/Linux/2017-01/139373.htm
相關文章