awk模式之正則及常用的字串函式

2021-08-31 07:45:29 字數 4475 閱讀 4204

awk的內建字串函式

1. 格式化輸出print和printf

// 和c語言風格一致,-表示左對齊,預設是右對齊;%s字元型,%d十進位制數值型,%f浮點型

[root@mysql-master ~]# awk -f":" '' /tmp/file1

username: root uid: 0

username: bin uid: 1

username: daemon uid: 2

[root@mysql-master ~]#

[root@mysql-master ~]# awk -f":" '' /tmp/file1

root 0

bin 1

daemon 2

[root@mysql-master ~]#

2. 正規表示式
[root@mysql-master ~]# awk '/^root/' /tmp/file1 

root:x:0:0:root:/root:/bin/bash

[root@mysql-master ~]# awk '$0 ~ /^root/' /tmp/file1 # 與上面等價,~表示匹配

root:x:0:0:root:/root:/bin/bash

[root@mysql-master ~]#

[root@mysql-master ~]# awk '!/^root/' /tmp/file1

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@mysql-master ~]# awk '$0 !~ /^root/' /tmp/file1 # 與上面等價,!~表示不匹配

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@mysql-master ~]# awk '$nf!~/bash/' /tmp/file1 #篩選shell不是bash的使用者

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@mysql-master ~]#

3. 關係運算子及其他運算子

運算子說明

運算子說明

丨丨 , &&

邏輯或=,+=,-+,*=,/=,%=

賦值,運算

丨按位與

<=,>=,<,>

小於等於,大於等於,小於,大於

^按位異或

<<,>>

按位左移,按位右移

&按位與

+,-,*,/,%

加減乘除取模

==,!=

等於,不等於

!,~邏輯非,按位取反或補碼

其他運算子說明$

字段引用

空格字串連線符

?:c語言中條件表示式

in陣列中是否存在某鍵值

例:

[root@mysql-master ~]# awk 'begin'

ok[root@mysql-master ~]# awk 'begin'

1[root@mysql-master ~]# awk 'begin'

0[root@mysql-master ~]#

[root@mysql-master ~]# awk -f":" ' end }' /tmp/file1 

0 root

1 bin

2 daemon

[root@mysql-master ~]# awk -f":" ' end end}' /etc/passwd

/bin/sync 1

/bin/bash 4

/sbin/nologin 17

/sbin/halt 1

/sbin/shutdown 1

[root@mysql-master ~]#

[root@mysql-master /soft/scripts]# ss -an |grep 80 |awk ' end}'

listen 31

estab 84

[root@mysql-master /soft/scripts]# sh tcp_status.sh

estab: 84

listen: 31

[root@mysql-master /soft/scripts]#

例4:對訪問ip的top10進行排序
ss -ant |grep ':80' |awk -f":" '!/listen/ end}'|sort -k2 -rn|head -10

例5:統計nginx某一天的pv量《統計日誌》

[root@web-node2 ~]# grep '22/oct/2018' /var/log/nginx/access.log|wc -l

55 # nginx某一天的pv量

[root@web-node2 ~]# grep '22/oct/2018' | awk ' end}' /var/log/nginx/access.log-20181107

192.168.1.100訪問次數:36

192.168.1.10訪問次數:1

[root@web-node2 ~]# awk '/22\/oct\/2018/ end}' /var/log/nginx/access.log-20181107

192.168.1.100訪問次數:36

192.168.1.10訪問次數:1

[root@web-node2 ~]# awk '/22\/oct\/2018/ end}' /var/log/nginx/access.log-20181107 |sort -k2 -rn -t":"|head -10

192.168.1.100訪問次數: 36

192.168.1.10訪問次數: 1

## 還是先用grep方便點,不用轉義的

格式

描述gsub( ere, repl, [ in ] )

除了正規表示式所有具體值被替代這點,它和 sub 函式完全一樣地執行。

sub( ere, repl, [ in ] )

用 repl 引數指定的字串替換 in 引數指定的字串中的由 ere 引數指定的擴充套件正規表示式的第乙個具體值。sub 函式返回替換的數量。出現在 repl 引數指定的字串中的 &(和符號)由 in 引數指定的與 ere 引數的指定的擴充套件正規表示式匹配的字串替換。如果未指定 in 引數,預設值是整個記錄($0 記錄變數)。

index( string1, string2 )

在由 string1 引數指定的字串(其中有出現 string2 指定的引數)中,返回位置,從 1 開始編號。如果 string2 引數不在 string1 引數中出現,則返回 0(零)。

length [(string)]

返回 string 引數指定的字串的長度(字元形式)。如果未給出 string 引數,則返回整個記錄的長度($0 記錄變數)。

例1:gsub,sub使用

#在 info中查詢滿足正規表示式,/[0-9]+/ 用」」替換,並且替換後的值,賦值給info 未給info值,預設是$0

[root@mysql-master ~]# awk 'begin'

this is a test--aaaa!

例2:查詢字串(index使用)
[root@mysql-master ~]# awk 'begin'

no found

例3:awk使用外部變數的三種方法
方法1. 在雙引號的情況下

[root@mysql-master ~]# echo "lss linux" |awk "gsub(/lss/,\"$user\")"

root linux

方法2. 在單引號的情況下

[root@mysql-master ~]# echo "lss linux" |awk 'gsub(/lss/,"'"$user"'")'

root linux

# 列印出磁碟佔用率大於10%的掛載點

[root@mysql-master ~]# df -h |awk '}'

/:12%

/boot:13%

[root@mysql-master ~]# echo "lss linux" |awk -v user=root 'gsub(/lss/,user)'

root linux

[root@mysql-master ~]# echo "lss linux" |awk -v user=root "gsub(/lss/,user)"

root linux

字串及字串的方法

一 字串 js中的任何資料型別都可以當作物件來看。所以string既是基本資料型別,又是物件。二 宣告字串 var sstr 字串 var ostr new string 字串 三 字串屬性 1.length計算字串的長度 不區分中英文 var str hello world console.log...

Lua學習之字串函式及模式匹配

對於簡單的函式,我只是將其以舉例的方式羅列一下,對於一些功能較多的函式,會舉例分析一下,並簡單總結,全文以舉例為驅動。一,字元類基礎函式舉例介紹 string.len string string.lower string string.upper string string.rep a 5 aaaa...

Lua學習筆記之字串及模式匹配

string.len string string.lower string string.upper string string.rep a 5 aaaaa string.sub string i j string.sub s,string.find s,world string.sub函式會提取子...