Linux文本处理三剑客之awk
生活随笔
收集整理的這篇文章主要介紹了
Linux文本处理三剑客之awk
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.簡介
? ?? ?awk是linux下的一個命令,他對其他命令的輸出,對文件的處理都十分強大。
相對于grep的查找,sed的編輯,awk在其對數據分析并生成報告時,顯得尤為強
大。簡單來說awk就是把文件逐行的讀入,以空格為默認分隔符將每行切片,切開
的部分再進行各種分析處理。其實他更像一門編程語言,他可以自定義變量,有條
件語句,有循環,有數組,有正則,有函數等。他讀取輸出,或者文的方式是一行
,一行的讀,根據你給出的條件進行查找,并在找出來的行中進行操作,感覺他的
設計思想,真的很簡單,但是結合實際情況,具體操作起來就沒有那么簡單了。
? ? ? ?awk有三種形勢,awk,gawk,nawk,平時所說的awk其實就是gawk。
2.awk的工作原理
? ? ?awk 'BEGIN{ commands } pattern{ commands } END{ commands }'
?? ? 第一步:執行BEGIN{ commands }語句塊中的語句;
?? ? 第二步:從文件或標準輸入(stdin)讀取一行,然后執行pattern{ commands }
?? ? ? ? ? ? ? ? 語句塊,它逐行掃描文件,從第一行到最后一行重復這個過程,直到文
?? ? ? ? ? ? ? ? 件全部被讀取完畢。
?? ? 第三步:當讀至輸入流末尾時,執行END{ commands }語句塊。BEGIN語句
?? ? ? ? ? ? ? ? 塊在awk開始從輸入流中讀取行之前被執行,這是一個可選的語句塊,
?? ? ? ? ? ? ? ? ?比如變量初始化、打印輸出表格的表頭等語句通常可以寫在BEGIN語
?? ? ? ? ? ? ? ? ?句塊中。 END語句塊在awk從輸入流中讀取完所有的行之后即被執行
?? ? ? ? ? ? ? ? ?,比如打印所有行的分析結果這類信息匯總都是在END語句塊中完成
?? ? ? ? ? ? ? ? ?,它也是一個可選語句塊。 pattern語句塊中的通用命令是最重要的部
?? ? ? ? ? ? ? ? ?分,它也是可選的。如果沒有提供pattern語句塊,則默認執行{ print }
?? ? ? ? ? ? ? ? ?,即打印每一個讀取到的行,awk讀取的每一行都會執行該語句塊。? ? ?
?? ?
3.awk工作模式? ? 模式可以是以下任意一個:?/正則表達式/:使用通配符的擴展集。關系表達式:使用運算符進行操作,可以是字符串或數字的比較測試。模式匹配表達式:用運算符~(匹配)和~!(不匹配)。BEGIN語句塊、pattern語句塊、END語句塊。
? ? ? ?
4.實例
假設last -n 5的輸出如下
[root@www ~]# last -n 5 <==僅取出前五行
root ? ? pts/1 ? 192.168.1.100 ?Tue Feb 10 11:21 ? still logged inroot ? pts/1 ? 192.168.1.100 ?Tue Feb 10 00:46 - 02:28 ?(01:41)
root ? ? pts/1 ? 192.168.1.100 ?Mon Feb ?9 11:41 - 18:30 ?(06:48)
dmtsai ? pts/1 ? 192.168.1.100 ?Mon Feb ?9 11:41 - 11:41 ?(00:00)
root ? ? tty1 ? ? ? ? ? ? ? ? ? Fri Sep ?5 14:09 - 14:10 ?(00:01)
如果只是顯示最近登錄的5個帳號
#last -n 5 | awk ?'{print $1}'
root
root
root
dmtsai
rootawk
工作流程是這樣的:讀入有'\n'換行符分割的一條記錄,然后將記錄按指定的域分
隔符劃分域,填充域,$0則表示所有域,$1表示第一個域,$n表示第n個域。
默認域分隔符是"空白鍵" 或 "[tab]鍵",所以$1表示登錄用戶,$3表示登錄用戶ip,
以此類推。
如果只是顯示/etc/passwd的賬戶
#cat /etc/passwd |awk ?-F ':' ?'{print $1}' ?root
daemon
bin
sys
這種是awk+action的示例,每行都會執行action{print $1}。
-F指定域分隔符為':'。
如果只是顯示/etc/passwd的賬戶和賬戶對應的shell,而賬戶與shell之間以tab鍵分割
#cat /etc/passwd |awk ?-F ':' ?'{print $1"\t"$7}'root ? ?/bin/bash
daemon ?/bin/shbin ? ? /bin/shsys ? ? /bin/sh
如果只是顯示/etc/passwd的賬戶和賬戶對應的shell,而賬戶與shell之間以逗號分
割,而且在所有行添加列名name,shell,在最后一行添加"blue,/bin/nosh"。
cat /etc/passwd |awk ?-F ':' ?'BEGIN {print "name,shell"} ?{print $1","$7}
END {print "blue,/bin/nosh"}'name,shell
root,/bin/bash
daemon,/bin/shbin,/bin/shsys,/bin/sh....
blue,/bin/nosh
搜索/etc/passwd有root關鍵字的所有行
#awk -F: '/root/' /etc/passwdroot:x:0:0:root:/root:/bin/bash
這種是pattern的使用示例,匹配了pattern(這里是root)的行才會執行action(沒有
指定action,默認輸出每行的內容)。
搜索支持正則,例如找root開頭的: awk -F: '/^root/' /etc/passwd
搜索/etc/passwd有root關鍵字的所有行,并顯示對應的shell
# awk -F: '/root/{print $7}' /etc/passwd ? ? ? ? ? ? /bin/bash
這里指定了action{print $7}? ? ? ?
?
5,運算符
運算符描述
= += -= *= /= %= ^= **= ? ?賦值 ? ?
?: ? ?C條件表達式 ? ?
|| ? ?邏 輯或 ? ?
&& ? ?邏輯與 ? ?
~ ~! ? ?匹 配正則表達式和不匹配正則表達式 ? ?
< <= > >= != == ? ?關 系運算符 ? ?
空格 ? ?連接 ? ?
+ - ? ?加,減 ? ?
* / & ? ?乘,除與求余 ? ?
+ - ! ? ?一元加,減和邏輯非 ? ?
^ *** ? ?求冪 ? ?
++ -- ? ?增加或減少,作為前綴或后綴 ? ?
$ ? ?字 段引用 ? ?
in ? ?數組成員 ? ?
例子:awk 'BEGIN{a="b";print a++,++a;}' 0 2
6,awk的正則
匹配符描述
\Y ? ?匹配一個單詞開頭或者末尾的空字符串 ? ?
\B ? ?匹配單詞內的空字符串 ? ?
\< ? ?匹配一個單詞的開頭的空字符串,錨定開始 ? ?
\> ? ?匹配一個單詞的末尾的空字符串,錨定末尾 ? ?
\W ? ?匹配一個非字母數字組成的單詞 ? ?
\w ? ?匹配一個字母數字組成的單詞 ? ?
\' ? ?匹配字符串末尾的一個空字符串 ? ?
\‘ ? ?匹配字符串開頭的一個空字符串 ? ?
7,字符串函數
函數名描述
sub ? ?匹配記錄中最大、最靠左邊的子字符串的正則表達式,并用替換字符串替換這些字符串。如果沒有指定目標字符串就默認使用整個記錄。替換只發生在第一次匹配的 時候 ? ?
gsub ? ?整個文檔中進行匹配 ? ?
index ? ?返回子字符串第一次被匹配的位置,偏移量從位置1開始 ? ?
substr ? ?返回從位置1開始的子字符串,如果指定長度超過實際長度,就返回整個字符串 ? ?
split ? ?可按給定的分隔符把字符串分割為一個數組。如果分隔符沒提供,則按當前FS值進行分割 ? ?
length ? ?返回記錄的字符數 ? ?
match ? ?返回在字符串中正則表達式位置的索引,如果找不到指定的正則表達式則返回0。match函數會設置內建變量RSTART為字符串中子字符串的開始位 置,RLENGTH為到子字符串末尾的字符個數。substr可利于這些變量來截取字符串 ? ?
toupper和tolower ? ?可用于字符串大小間的轉換,該功能只在gawk中有效 ? ?
8,數學函數
函數名返回值
atan2(x,y) ? ?y,x 范圍內的余切 ? ?
cos(x) ? ?余弦函數 ? ?
exp(x) ? ?求 冪 ? ?
int(x) ? ?取整 ? ?
log(x) ? ?自然對 數 ? ?
rand() ? ?隨機數 ? ?
sin(x) ? ?正弦 ? ?
sqrt(x) ? ?平 方根 ? ?
srand(x) ? ?x是rand()函數的種子 ? ?
int(x) ? ?取 整,過程沒有舍入 ? ?
rand() ? ?產生一個大于等于0而小于1的隨機數 ? ??
? ? ? ?? ? ? ??
轉載于:https://blog.51cto.com/willis/1845918
總結
以上是生活随笔為你收集整理的Linux文本处理三剑客之awk的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 服务器双网卡绑定
- 下一篇: javascript等号判断相等流程