1. 程式人生 > >19.三劍客之awk

19.三劍客之awk

awk:格式化文字輸出
awk是逐行處理的,逐行處理的意思就是說,當awk處理一個文字時,會一行一行進行處理,處理完當前行,再處理下一行,awk預設以"換行符"為標記,識別每一行,也就是說,awk跟我們人類一樣,每次遇到"回車換行",就認為是當前行的結束,新的一行的開始,awk會按照使用者指定的分割符去分割當前行,如果沒有指定分割符,預設使用空格或者tab鍵作為分隔符。

基本用法:
awk [options] ‘program’ var=value file…
awk [options] -f programfile var=value file…
awk [options] ‘BEGIN{ action;… } pattern{ action;… } END{ action;… }’ file …
awk 程式通常由:BEGIN語句塊、能夠使用模式匹配的通用語句塊、END語句塊,共3部分組成
program通常是被單引號或雙引號中

常用選項
-F:指定分隔符
-v:後面帶變數
-f:引用program指令碼

欄位
把每一行用指定的分隔符隔開,每一小段就稱為一個欄位。
$1:表示第一個欄位
$N:表示第N個欄位
$NF:表示最後一個欄位
$(NF-1):表示倒數第二個欄位

記錄
1.平時不指定記錄分隔符的話,預設每一行就是一條記錄。我們也可以指定記錄分隔符。
2.RS:可以定義一條記錄的分隔符,預設是\n
3.記錄不一定是在同一行的,也有有可能跨多行
4.通常不會指定分隔符,都是以一行作為一條記錄,瞭解一下即可

例子:
[[email protected]_101 data]#cat temp.txt
1,2,3;A,B,C;a,b,c 如果以";“作為記錄分隔符的話,這一行有3條記錄。
[

[email protected]_101 data]#awk -v FS=”," -v RS=";" ‘{print $1,$2}’ ./temp.txt
1 2
A B
a b

變數
變數:分為內建和自定義變數。

常見變數:
FS:輸入欄位分隔符,預設為空白字元
OFS:輸出欄位分隔符,預設為空白字元
RS:輸入記錄分隔符,指定輸入時的換行符
ORS:輸出記錄分隔符,輸出時用指定符號代替換行符
NF:欄位數量
NR:記錄號
FNR:各檔案分別計數,記錄號
FILENAME:當前檔名

例子:
1.如果是awk內變數,直接寫上變數名即可
#awk -v FS=":" ‘{print $1FS$4}’ /etc/passwd

2.也可以引用shell中的變數,KaTeX parse error: Expected 'EOF', got '#' at position 5: var #̲fs=:;awk -v FS=fs ‘{print $1FS$4}’ /etc/passwd

3.指定輸出分隔符為tab鍵:\t
#awk -v FS=":" -v OFS="\t" ‘{print $1,$4}’ /etc/passwd

自定義變數
1.格式:-v var=" "
2.直接在program內定義

例子:
#awk -F":" -v USER=“username” -v UID=“userid” ‘{print USER":"$1,UID":"$3}’ /etc/passwd

另一中寫法:
#awk -F":" ‘{USER=“username”;UID=“userid”;print USER":"$1,UID":"$3}’ /etc/passwd

printf格式化列印
定義格式化輸出。
格式化輸出:printf “FORMAT”, 欄位1, 欄位2, …
(1) 必須指定FORMAT
(2) 不會自動換行,需要顯式給出換行控制符,\n

FORMAT中需要分別為後面每個欄位指定格式符
格式符:與欄位一一對應
%c: 顯示字元的ASCII碼
%d, %i: 顯示十進位制整數
%e, %E:顯示科學計數法數值
%f:顯示為浮點數
%g, %G:以科學計數法或浮點形式顯示數值
:顯示字串
%u:無符號整數
%%: 顯示%自身

修飾符:
#[.#]:第一個數字控制顯示的總寬度;第二個#表示小數點位數,沒有四捨五入:%3.1f
-: 左對齊(預設右對齊) %-15s
+:顯示數值的正負符號 %+d

同時使用多個分隔符
1.下例使用"空格 和 :“作為分隔符
[[email protected]_101 data]#echo “a:c b;1:2 3” |awk -v RS=”;" -F"[ :]" ‘{print $1,$2,$3}’
a c b
1 2 3

2.一個或者多個空格和%作為分隔符
[[email protected]_101 ~]#df | awk -F" +|%" ‘/^/dev/sda/{print $1,$5}’
/dev/sda2 21
/dev/sda5 1
/dev/sda1 17

例子:
1.-表示左對齊
#awk -F":" ‘{printf “%-30s %-10d\n”,$1,$3}’ /etc/passwd

操作符
1.算術操作符:
x+y, x-y, x*y, x/y, x^y, x%y

  • x:轉換為負數
    +x:將字串轉換為數值

2.字串操作符:沒有符號的操作符,字串連線
賦值操作符:
=, +=, -=, *=, /=, %=, ^=,++, –

例子:
•awk ‘BEGIN{i=0;print ++i,i}’:先運算加1,再列印
•awk ‘BEGIN{i=0;print i++,i}’:先列印,再運算加1

3.比較操作符:
==, !=, >, >=, <, <=
例子:
[[email protected]_101 ~]#awk -F: ‘$3==0{print $0}’ /etc/passwd
root❌0:0:root:/root:/bin/bash

[[email protected]_101 ~]#awk -F: ‘$3>=1000{print $0}’ /etc/passwd
nfsnobody❌65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
chen❌1000:1000:chen:/home/chen:/bin/bash
bash❌1001:1002::/home/test:/bin/bash

==和=的區別
#awk -F: ‘$3==1{print $0}’ /etc/passwd :這個查詢$3的值等於1的行
#awk -F: ‘$3=1{print $0}’ /etc/passwd:這個是把所有$3的值賦值等於1

4.模式匹配符:
~:左邊是否和右邊匹配包含 !~:是否不匹配
匹配內容用//,//內可以使用正則表示式
例子:
[[email protected]_101 ~]#awk -F: ‘$0~/root/{print $1}’ /etc/passwd
root
operator

[[email protected]_101 ~]#awk -F: ‘/bash$/{print $0}’ /etc/passwd
root❌0:0:root:/root:/bin/bash
chen❌1000:1000:chen:/home/chen:/bin/bash
bash❌1001:1002::/home/test:/bin/bash

5.邏輯操作符
與&&:條件同時滿足
或||:其他一個條件滿足即可
非!:條件結果取反

例子:
[[email protected]_101 ~]#awk -F: ‘$3>=0 && $3 <=100{print $1}’ /etc/passwd
[[email protected]_101 ~]#awk -F: ‘$3==0 || $3>=1000{print $1}’ /etc/passwd

下面2兩種等價
[[email protected]_101 ~]#awk -F: ‘!($3==0){print $1}’ /etc/passwd
[[email protected]_101 ~]#awk -F: ‘$3!=0{print $1}’ /etc/passwd

取反操作
[[email protected]_101 ~]#awk -F: ‘$3>=500{print $1}’ /etc/passwd
[[email protected]_101 ~]#awk -F: ‘!($3>=500){print $1}’ /etc/passwd

6.條件表示式(三目表示式)
selector?if-true-expression:if-false-expression
A?B:C–表示A為真,執行B,A為假,執行C
例子:
[[email protected]_101 ~]#awk -F: ‘{$3>=1000?usertype=“Common User”:usertype=“SysUser”;printf “%30s:%-s\n”,$1,usertype }’ /etc/passwd

awk的PATTERN
PATTERN:根據pattern條件,過濾匹配的行,再做處理
(1)如果未指定:空模式,匹配每一行
(2) /regular expression/:僅處理能夠模式匹配到的行,需要用/ /括起來

例子:
awk ‘/^UUID/{print $1}’ /etc/fstab
awk ‘!/^UUID/{print $1}’ /etc/fstab

統計連線IP數
[[email protected]_101 ~]#netstat -nt | awk -F" +|:" ‘/^tcp/{print $6}’ | sort |uniq -c |sort -rn
3 172.20.34.100
1 172.20.34.102

指定某一行匹配正則表示式
[[email protected]_101 data]#awk -F: ‘NF/bashNF ~ /bash/{print 1,1,NF}’ /etc/passwd

(3) relational expression: 關係表示式,結果為“真”才會被處理
真:結果為非0值,非空字串
假:結果為空字串或0值

例子:
[[email protected]_101 data]#awk –F: ‘$3>=1000{print $1,$3}’ /etc/passwd
[[email protected]_101 data]#awk -F: ‘$3<1000{print $1,KaTeX parse error: Expected 'EOF', got '}' at position 2: 3}̲' /etc/passwd […NF=="/bin/bash"{print 1,1,NF}’ /etc/passwd

(4) line ranges:行範圍
startline,endline:/pat1/,/pat2/ 不支援直接給出數字格式

例子:
[[email protected]_101 data]#awk -F: ‘/root>/,/nobody>/{print $1}’ /etc/passwd
[[email protected]_101 data]#awk -F: ‘(NR>=10&&NR<=20){print NR,$1}’ /etc/passwd
[[email protected]_101 data]#awk -F: ‘/b/,/f/’ /etc/passwd

(5) BEGIN/END模式
格式:‘BEGIN{ action;… } pattern{ action;… } END{ action;… }’
BEGIN{}: 僅在開始處理檔案中的文字之前執行一次
END{}:僅在文字處理完成之後執行一次

例子:
[[email protected]_101 data]#awk -F: ‘BEGIN{print “USER USERID”}{print $1":"$3}END{print “end file”}’ /etc/passwd

[[email protected]_101 data]#awk -F: ‘{print “USER USERID”;print $1":"$3} END{print “end file”}’ /etc/passwd

[[email protected]_101 data]#awk -F: ‘BEGIN{print “USER UID \n----------”}END{print “USER UID\n==========”}’ /etc/passwd

[[email protected]_101 data]#seq 10 | awk ‘i=!i’
1
3
5
7
9
[[email protected]_101 data]#seq 10 | awk -v i=1 ‘i=!i’
2
4
6
8
10

等價於:
#seq 10 | sed -n ‘1~2p’
#seq 10 | sed -n ‘2~2p’
#seq 1 2 10

相關推薦

19.三劍客awk

awk:格式化文字輸出 awk是逐行處理的,逐行處理的意思就是說,當awk處理一個文字時,會一行一行進行處理,處理完當前行,再處理下一行,awk預設以"換行符"為標記,識別每一行,也就是說,awk跟我們人類一樣,每次遇到"回車換行",就認為是當前行的結束,新的一

linux 文本三劍客awk

linux awk 練習awk簡介 awk同sed、grep被稱為linux文本處理三劍客,都起源於行編輯器ed。awk繼承了行編輯器的特點,循環的讀取文本的每一行(或者是分隔符分割的每一段文本)直至文本結束,但是awk加入了段分割符的概念.將每次讀入的行進行再次分割.awk每次讀取的行都只是未

linux三劍客awk必殺技一例   linux命令

linux 三劍客 awk []:有框表示從最開始計算(小分隔符),否則從數據開始計算,無[] +:加號則從最開始計算,否則從數據開始計算[] +: 加號則從最開始計算,否則從數據最開始計算請執行命令取出linux中eth0的IP地址(請用cut,有能力者也可分別用awk,sed命令答)。解答:說

awk && sed (4)====linux 三劍客awk 命令

awkhttp://www.cnblogs.com/ginvip/p/6352157.html這是我發現的一篇博客,關於awk 的內容寫的很好,需要的可以看看awk 關於!號(1)取奇數行[root@localhost shell]# seq 10 | awk ‘i=!i‘13579(2)取偶數行[root@

Linux系統命令三劍客 awk

linux 命令 awk命令名稱:awk作用: 對文本和數據進行處理詳細說明: awk 是一種編程語言,用於在linux/unix下對文本和數據進行處理。 數據可以來自標準輸入(stdin)、一個或多個文件,或其它命令的輸出。 它在命令行中使用,但更多是作為腳本來使用。awk有很多內建的

文本三劍客awk基礎操作

line 範圍 item之間 $nf 可選 小數點 expr i++ 科學計數法 1. awk基本介紹 功能說明:gawk - pattern scanning and processing languageawk是GNU項目,所以其實際的命令為gawk,因awk命令的二進

三劍客awk

pdu 復制 同時 begin 等等 字母 mon inpu 排列 短介:awk是一個強大的文本分析工具,相當於grep查找,sed替換。awk再其對數據分析以及生成報告時顯得尤其強大。 awk有3個不同的版本:awk nawk gawk,一般指gawk,gawk是awk的

1.12-linux三劍客awk用法詳解

-a proc == 行號 oss url oldboyedu rap oai 1.12linux三劍客之awk用法詳解內容:1. awk執行過程2. awk命令格式3. awk用法4. awk數組第1章 awk執行過程 一直讀取到文件的最後一行第2章 awk ‘找誰{幹啥

Linux學習總結(二十一)正則三劍客awk

awkawk 也是流式編輯器,它比sed的功能更強大 1.截取文檔中的某段 awk -F ‘:‘ ‘{print $1}‘ /etc/passwd |head -2-F 指定分割符,不指定以空格或者tab為分隔符print 為打印動作$1 為第一字段, $2 為第二字段,依次類推,$0標示整行那麽打印整個文檔

文本處理三劍客awk

awk文本處理三劍客之awk awk: 報告生成器,格式化文檔輸出; awk(gawk):pattern scanning and processing language 格式:awk [options...] 'program' file progra

Linux三劍客awk

awk前言 awk是linux實際工作中最重要強大的工具,而且還是一門編程語言,可以用來處理數據和生成報告(Excel),處理的數據可以是一個或多個文件。一>顯示出某個範圍內的內容測試文件及內容如下:[root@192 data]# cat testAwk.txt root:x:0:0:roo

linux 三劍客awk

eth0 組合 輸出 出現 不存在 數據類型 block $1 lse #AWK命令 基礎顯示 打印install.log文件中包含data字段行的第二區域 awk ‘/data/ {print $2}’ install.log 查看num10.txt的第一行 he

文本處理三劍客awk(原創)

創建 兩個 位置 正則 ack 最大 align common 因此 文本處理三劍客之awk(原創)AWK是一種優良的文本處理工具,Linux及Unix環境中現有的功能最強大的數據處理引擎之一。這種編程及數據操作語言(其名稱得自於它的創始人阿爾佛雷德·艾侯(Alfred A

文本三劍客awk

urn 邏輯或 mark bre 取出 整數 空格 讀取文件 val awk是一種報告生成器,能夠格式化輸出文本,有著多種版本,我們主要使用的是GNU awk,通常也稱之為gawk,可以進行模式掃描和處理的語言。 1.awk語法 awk的基本語法如下: awk [optio

Linux文本處理三劍客awk(一)

awk變量 信息 tro 不同 當前 block 文件中 是否 定義變量   AWK是一個優良的文本處理工具,Linux及Unix環境中現有的功能最強大的數據處理引擎之一。其名稱得自於它的創始人阿爾佛雷德·艾侯、彼得·溫伯格和布萊恩·柯林漢姓氏的首個字母

linux基礎篇-文本三劍客AWK

filename %u $1 ++i options else if day pri regexp awk介紹 ? awk:Aho, Weinberger, Kernighan,報告生成器,格式化文本輸出 ? 有多種版本:New awk(nawk),GNU awk( ga

Linux三劍客awk命令詳解

awk簡單入門 awk是一個強大的文字分析工具,相對於grep的查詢,sed的編輯,awk在其對資料分析並生成報告時,顯得尤為強大。簡單來說awk就是把檔案逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。 使用方法: awk '{pattern + a

shell三劍客awk 資料擷取工具 詳解

目錄 awk 資料擷取工具 ③變數 ④流程控制 ⑤陣列 ⑥內建函式 ①awk簡介 >>>awk是一種程式語言(解釋性語言,不需要編譯),用於資料擷取和報告的工具 >>>awk自動搜尋輸入的檔案

文字處理三劍客AWK

AWK簡介    AWK是一件上古神器,用這句話來形容AWK是最貼切不過了。    縱觀計算機發展的歷史,我們發現,awk幾乎是伴隨著計算機作業系統的發展一路走來。1970年作為計算機計時元年,誕生了UNIX和C語言這兩種偉大的事物。在

Linux進階篇--文字處理三劍客AWK

Linux進階篇–文字處理三劍客之AWK 本章概要 awk介紹 awk基本用法 awk變數 awk格式化 awk操作符 awk條件判斷 awk迴圈 awk陣列 awk函式 呼叫系統命令 一、 awk介紹 awk:Aho, Weinberger, Kerni