第19天 AWK詳解

2021-10-10 10:18:20 字數 4473 閱讀 3161

awk是一種處理文字檔案的語言,是乙個強大的文字分析工具。

舉例:1.所在路徑

[root@centos7 ~]#ll `which awk`

lrwxrwxrwx. 1 root root 4 may 10 13:05 /usr/bin/awk -> gawk

2.基本用法

awk '' /etc/fstab -- $1指的是第幾列。

舉例:awk ''

3.可以由3部分組成

beginend --begin和end決定了各自的語句在第幾行。

舉例: [root@centos7 data]#awk 'beginend' fstab

number

200200

200200

the end

4. -f "分隔符" $0整行,$1第一列

awk -f ":" '' passwd

5.1 fs:輸入字段分隔符,預設為空白字元

(1)基本用法 awk -v fs=':' '』 /etc/passwd

方便之處在於如果之前定義好了變數可以直接呼叫

[root@centos7 data]#fs=":"

[root@centos7 data]#awk -v fs=$fs '' passwd

(2)指定範圍 第一種 df|awk -f ' +|%' '

第二種 awk -f "[ |\" '' access_log

awk -f "[ " '' access_log

5.2 ofs:輸出字段分隔符,預設為空白字元

awk -f "[ " -v ofs="--" '' access_log |head -10

172.18.118.91--20/may/2018:08:09:59

172.18.118.91--20/may/2018:08:09:59

5.3 rs :輸入記錄分隔符,指定輸入時的換行符

awk -v rs=' ' 『』 /etc/passwd

[root@centos7 data]#cat awktest

a,b,c

d;e,f

gg;hh;xx

asd預設把';'分割看作一行

[root@centos7 data]#awk -f "," -v rs=';' '' awktest

a ehh xx

asd5.4 ors:輸出記錄分隔符,輸出時用指定符號代替換行符

awk -v rs=' ' -v ors='###'『』 /etc/passwd

[root@centos7 data]#awk -f "," -v ors='-----' '' awktest

a b-----d;e f-----gg;hh;xx -----asd -----

5.5 nf:字段數量

awk -f:'' /etc/fstab 引用變數時,變數前不需加$

awk -f:'' /etc/passwd

awk -f":" '' passwd 取最後一行

5.6 nr:記錄號

awk 『』 /etc/fstab ; awk end『』 /etc/fstab

awk '' passwd 加行號

5.7 fnr:各檔案分別計數,記錄號

awk '' /etc/fstab /etc/inittab --這樣會對每個檔案從頭編號

passwd 1 libstoragemgmt

passwd 2 colord

passwd 3 rpc

passwd 4 gluster

fstab 1 /dev/sda1 /boot xfs defaults 0 0

fstab 2 /dev/sda2 / xfs defaults 0 0

5.8 filename:當前檔名

awk '』 /etc/fstab

awk -f":" '' passwd fstab

5.9 argc:命令列引數的個數

awk '』 /etc/fstab /etc/inittab

awk 『begin 』 /etc/fstab /etc/inittab

5.10 ar**:陣列,儲存的是命令列所給定的各引數

awk 『begin 』 /etc/fstab /etc/inittab

awk 『begin 』 /etc/fstab /etc/inittab

5.11 自定義變數(區分字元大小寫)

(1) -v var=value

(2) 在program中直接定義

[root@centos7 data]#awk -v name='magedu' 'begin'

magedu

可以直接呼叫檔案

[root@centos7 data]#echo '' > f1.awk

[root@centos7 data]#awk -f: -f f1.awk passwd fstab

root 0

bin 1

daemon 2

adm 3

lp 4

6 printf

printf 格式 $1,$2

%c:顯示字元的ascii碼

%d, %i:顯示十進位制整數

%e, %e:顯示科學計數法數值

%f:顯示為浮點數

%g, %g:以科學計數法或浮點形式顯示數值

%s:顯示字串

%u:無符號整數

%%:顯示%自身

#[.#] 第乙個數字控制顯示的寬度;第二個#表示小數點後精度,%3.1f

- 左對齊(預設右對齊) %-15s

+ 顯示數值的正負符號 %+d

echo "aaa:123.456"|awk -f: ''

[root@centos7 data]#awk -v name='magedu' 'begin'

magedu

列印**

awk -f: 'begin' passwd

支援運算

x+y, x-y, x*y, x/y, x^y, x%y

- x:轉換為負數

+x:將字串轉換為數值

賦值 =, +=, -=, *=, /=, %=, ^=,++, --

比較操作符:

==, !=, >, >=, <, <=

awk -f: '$3==996''' passwd --中間不許有空格。

模式匹配符:

~:左邊是否和右邊匹配,包含

!~:是否不匹配

awk -f: '$1 ~ "rpc"''' passwd

awk -f: '! ($1 ~ "rpc")''' passwd

邏輯操作符:與&&,或||,非!

#awk -f: '! ($1 ~ "rpc")&& $3 <100''' passwd

條件表示式(三目表示式)

selector?if-true-expression:if-false-expression

awk -f: '$3<=100?line="less":line="more" ' passwd

支援正規表示式

awk -f: '/mail/' passwd --找出mail的行

continue;break

跳過5:awk 'begin}'

到5直接跳出 awk 'begin}'

陣列 awk 'begin'

99.例項

取訪問最多的ip

awk '' access_log |sort |uniq -c|sort -nr|head -3

取基數seq 10 |awk 'i=!i'

取偶數seq 10 |awk '!(i=!i)'

取ipifconfig ens33|awk '/netmask/'

取3-7行

seq 10|awk 'nr >2 && nr < 8'

取指定範圍的行

awk -f: '/ftp/,/rpc/' passwd

取大於10的行

df|awk -f ' +|%' '/\/dev\/sd/'

while練習

awk '/linux16/}' /boot/grub2/grub.cfg

100之內數相加

awk 'begin;print sum}'

列印ip出現的次數 ip[$1]++ 以第一列為下標 一般查詢出現最多的ip

awk 'end}' access_log

取最大值和最小值

cat num.txt |awk -f"," '}end'

取平均數

m 10

v 13

v 10

m 20

awk 'else}end' num2

顯示長度為4的字元

awk ''

顯示空白字元開始的行

awk '/^[ ]/' test2

計算乙個目錄下的檔案大小總和

python練習第19天

二叉樹的最大深度 給定乙個二叉樹,找出其最大深度。二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。說明 葉子節點是指沒有子節點的節點。示例 給定二叉樹 3,9,20,null,null,15,7 這個就是通過遞迴 class solution def maxdepth self,root t...

第44月第19天 SDK license

1.需要提供的引數 ios 應用bundleid android 包名和簽名資訊 md5 格式小寫無冒號 2.預燒錄預登記動態註冊預燒錄,指的是,我們後台預先生成授權的license檔案,然後預先寫入硬體裝置的儲存檔案中。在裝置首次啟動的時候,就直接調取license檔案進行啟用。這種方式適用於需要...

學習iOS開發的第19天

學了一下手勢識別器的運用。下面簡單地演示一下。手勢包括輕擊 捏合 平移 輕掃 旋轉 長按等。它們分別由相應類來實現。依次為uitapgesturerecognizer uipinchgesturerecognizer uipangesturerecognizer uiswipegesturereco...