gawk命令詳解


GNU awk:

sort、cut、uniq、wc等參考:
https://blog.csdn.net/lk07828/article/details/46324807
https://blog.csdn.net/dexter_wang/article/details/64482594
https://www.jianshu.com/p/a29f32e35dc5

 

文本處理三工具:grep, sed, awk

grep, egrep, fgrep:文本過濾工具;pattern

sed: 行編輯器

模式空間、保持空間

awk:報告生成器,格式化文本輸出;

 

AWK: Aho, Weinberger, Kernighan --> New AWK, NAWK

 

GNU awk, 簡稱gawk


gawk - pattern scanning and processing language   

 基本用法:gawk [options] 'program' FILE ...

program: PATTERN{ACTION STATEMENTS}

語句之間用分號分隔

print, printf    是ACTION STATEMENTS的兩個選項

選項:

-F:指明輸入時用到的字段分隔符;

-v var=value: 自定義變量;

 


1、print

print item1, item2, ...

要點:

(1) 逗號分隔符;

(2) 輸出的各item可以是字符串,也可以是數值;當前記錄的字段、變量或awk的表達式;

(3) 如省略item,相當於print $0;


2、變量

2.1 內建變量

FS:input field seperator,輸入時的字段分隔符,默認為空白字符;

OFS:output field seperator,輸出時的字段分隔符默認為空白字符;

 

RS:input record seperator,輸入時的換行符;

ORS:output record seperator,輸出時的換行符;

 

NF:number of field,每一行的字段數量

{print NF}, {print $NF}

如果引用awk內部的變量(比如NF)的話,是不能加$的,像$1,$2這是字段

 NR:number of record, 行數;

FNR:各文件分別計數;行數;

FILENAME:當前文件名;

 

ARGC:命令行參數的個數;

ARGV:數組,保存的是命令行所給定的各參數;

 

2.2 自定義變量

1、 -v var=value   自定義變量

變量名區分字符大小寫;

2、 在program中直接定義


3、printf命令

格式化輸出:printf  FORMAT, item1, item2, ...      

(1) FORMAT必須給出;

(2) 不會自動換行,需要顯式給出換行控制符,\n

(3) FORMAT中需要分別為后面的每個item指定一個格式化符號;

 

FORMAT格式符:

%c: 顯示字符的ASCII碼;

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

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

%f:顯示為浮點數;

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

%s:顯示字符串;

%u:無符號整數;

%%: 顯示%自身;

 以字符串形式顯示文件的第一個字段

 

修飾符:

#[.#]:第一個數字控制顯示的寬度;第二個#表示小數點后的精度;

%3.1f

-:左對齊

+:顯示數值的符號

 


4、操作符

算術操作符:

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

-x:負x

+x:把字符串轉換為數值;

 

字符串操作符:

沒有符號的操作符,表示字符串連接

 

賦值操作符:

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

++, --

 

比較操作符:

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

 

模式匹配符:

~:是否匹配

!~:是否不匹配

 

邏輯操作符:

&&

||

!

 

函數調用:

function_name(argu1, argu2, ...)

 

條件表達式:

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

selector:條件表達式

?:判斷為真還是為假,為真則執行if-true-expression,為假則執行if-false-expression

 

# awk -F: '{$3>=1000?usertype="Common User":usertype="Sysadmin or SysUser";printf "%15s:%-s\n",$1,usertype}' /etc/passwd

# awk -F: '{$3>=500?usertype="common user":usertype="sysadmin";printf "%15s: %4d:  %s\n",$1,$3,usertype}' /etc/passwd

 


5、PATTERN

(1) empty:空模式,匹配每一行;

(2) /regular expression/:僅處理能夠被此處的模式匹配到的行;

(3) relational expression: 關系表達式;結果有“真”有“假”;結果為“真”才會被處理;真:結果為非0值,非空字符串;

# awk -F: '$3>=500{print $1,$3}' /etc/passwd   大於500才會處理
polkitd 999
# awk -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd
root /bin/bash
# awk -F: '$NF~/bash$/{print $1,$NF}' /etc/passwd     /bash$/  模式要用//括起來,$表示以bash結尾,~表示模式匹配符號
root /bin/bash

 

# awk -F: '$3>=40{printf "%15s: %d\n",$1,$3}' /etc/passwd | sort -n -k 2 -t:
   apache: 48 tcpdump: 72 sshd: 74 dbus: 81 postfix: 89 nobody: 99 systemd-network: 192 polkitd: 999

(4) line ranges:行范圍,指定起始結束行

startline,endline:/pat1/,/pat2/

#awk -F: '/^nobody/,/^sshd/{print $1}' /etc/passwd

# awk -F: '/^root/,/^mysql/{print $1}' /etc/passwd

注意: 不支持直接給出數字的格式

# awk -F: '(NR>=2&&NR<=10){print $1}' /etc/passwd

# awk '(NR==2)' /etc/passwd   //打印第二行

# awk '(NR==2)' /etc/passwd   //打印第二行

# awk 'NR==1{print}' /etc/passwd root:x:0:0:root:/root:/bin/bash

 

如何取/etc/passwd第二行,去重后排序(未完成)
# sed -n "2,1p" /etc/passwd | awk -F: '{print $1,$2,$3,$4,$5,$6,$7}'
bin x 1 1 bin /bin /sbin/nologin

 

(5) BEGIN/END模式    

BEGIN{}: 僅在開始處理文件中的文本之前執行一次;

# awk -F: 'BEGIN{print "  username  uid\n-----"}{printf "%15s,%8s\n",$1,$3}' /etc/passwd   //打印表頭

END{}:僅在文本處理完成之后執行一次;

#awk -F: 'BEGIN{print "          username    uid\n-----"}{printf "%15s,%8s\n",$1,$3}END{print "===========\n   END"}' /etc/passwd     

 注:如果不對文件做處理,可以在前面加BEGIN

# awk 'BEGIN{weekdays["mon"]="monday";weekdays["tue"]="Tuesday";print weekdays["mon"]}'

 

6、常用的action

(1) Expressions  表達式

(2) Control statements:控制語句 ,比如if, while等;

(3) Compound statements:組合語句;

(4) input statements:輸入語句

(5) output statements:輸出語句

 

7、控制語句

if(condition) {statments} 單分支語句

if(condition) {statments} else {statements}組合語句

while(conditon) {statments}  while循環

do {statements} while(condition)  do循環

for(expr1;expr2;expr3) {statements}  for循環

break   控制語句

continue  

delete array[index]  從數組中刪除指定元素

delete array    刪除整個數組

exit

{ statements } 組合語句

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM