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 } 組合語句