awk是一個程序,同時又是一種編程語言,通過是用他可以創建簡單的報表,分析數據,log文件,處理文本文件等。
1.awk命令行語法如下:
awk 'script' files
#其中script是awk指定的文件,
#files是awk處理的文件,可以是一個也可以是多個
#awk會一行一行的處理文件,將一行文件用分隔符(默認是空格),分隔成一個一個字符串,第一個字段是$1,
例:awk -F: '/^root:/{ print $1,$3,$6 }' /etc/passwd
結果:root 0 /root
#root:x:0:0:root:/root:/bin/bash
#以冒號:分隔,以root開頭,打印第一、第三、第六字段
[root@VM_79_126_centos etc]# awk -F: '/^root:/{ print; }' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@VM_79_126_centos etc]# awk -F: '/^root:/{ print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
#print $0 和print;結果是一樣的,都是打印一行數據
[root@VM_79_126_centos etc]# awk -F: '/^root:/{ print "User Name:\t" $1 "\nUid:\t\t" $3 "\nHome dir:\t",$6;}' /etc/passwd
User Name: root
Uid: 0
Home dir: /root
#可以添加字符串參數 \t \n
[root@VM_79_126_centos ~]# awk -F: -f user.awk /etc/passwd
USERNAME Uid
------------------------
root 0
bin 1
daemon 2
_____________________________________________________
[root@VM_79_126_centos ~]# cat user.awk
#print title to clasrify the following data before main loop begin
BEGIN{
print "\n","USERNAME"," ","Uid";
print "------------------------\n";
}
{
print "\n",$1," ",$3;
}
#-f可以執行awk文件 —F是分隔符
#使用表達式,可用||,&&來進行連接
[root@VM_79_126_centos ~]# awk -F: '($3>=1000) || ($7=="/bin/bash") {print $1;}' /etc/passwd
root
#使用next,可以跳過第二個選擇,避免重複操作
[root@VM_79_126_centos ~]# cat 1.sh
#!/bin/bash
awk -F: '
$7=="/bin/bash" {print $1;next;}
$3>=1000 {print $1;}
' /etc/passwd
[root@VM_79_126_centos ~]# sh 1.sh
root
#將ls -l的信息反轉
[root@VM_79_126_centos ~]# ls -l
total 1312
drwxr-xr-x 2 root root 4096 Mar 23 21:15 11
-rw-r--r-- 1 root root 92 Jun 8 08:31 1.sh
-rw-------. 1 root root 2229 Jan 20 2015 anaconda-ks.cfg
drwxrwxr-x 6 1000 1000 4096 Mar 21 14:50 beautifulsoup4-4.3.2
-rw-r--r-- 1 root root 143356 Oct 22 2013 beautifulsoup4-4.3.2.tar.gz
drwxr-xr-x 2 root root 4096 Nov 21 2015 Desktop
-rw-r--r-- 1 root root 0 Mar 20 16:48 message
-rw-r--r-- 1 root root 0 Mar 20 16:22 messages
drwxr-xr-x 7 501 games 4096 Mar 21 13:32 pip-8.1.1
-rw-r--r-- 1 root root 1139175 Mar 17 21:53 pip-8.1.1.tar.gz
drwxr-xr-x 2 root root 4096 Mar 23 16:59 py
-rw------- 1 root root 0 Apr 8 01:05 pythonhistory
-rw-r--r-- 1 root root 308 Jun 8 11:10 reverse.sh
drwxr-xr-x 2 root root 4096 Mar 23 17:29 shell
drwxr-xr-x 3 root root 4096 Mar 23 21:13 test
-rw-r--r-- 1 root root 184 Jun 7 22:52 user.awk
drwxr-xr-x 3 root root 4096 Dec 9 13:32 wp
[root@VM_79_126_centos ~]# cat reverse.sh
#!/bin/bash
ls -l|awk '
BEGIN{
printf("%-12s%-8s%-13s%-5s%-8s%-5s%s\n",
"Filename","Time","Date","Size","Group","User","Link","Right");
printf("------------------------------------------------------------\n");
}
$1 !~/total/{
printf("%-12s%-8s%-13s%-5s%-8s%-5s%s\n"),$8,$7,$6,$5,$4,$3,$2,$1;
}'
exit 0
[root@VM_79_126_centos ~]# sh reverse.sh
Filename Time Date Size Group User Link
------------------------------------------------------------
21:15 23 Mar 4096 root root 2
08:31 8 Jun 92 root root 1
2015 20 Jan 2229 root root 1
14:50 21 Mar 4096 1000 1000 6
2013 22 Oct 143356root root 1
2015 21 Nov 4096 root root 2
16:48 20 Mar 0 root root 1
16:22 20 Mar 0 root root 1
13:32 21 Mar 4096 games 501 7
21:53 17 Mar 1139175root root 1
16:59 23 Mar 4096 root root 2
01:05 8 Apr 0 root root 1
11:11 8 Jun 308 root root 1
17:29 23 Mar 4096 root root 2
21:13 23 Mar 4096 root root 3
22:52 7 Jun 184 root root 1
13:32 9 Dec 4096 root root 3
#將ls -l的結果通過管道給awk處理,通過value !~/patten/將第一行total排除,然後再將數據輸出
#value ~/patten/ 如果value匹配成功,patten返回真,並執行後面的語句
#value !~/patten/ 如果value匹配不成功,patten返回真,並執行後面的語句
awk也是一種編程語言,可以進行運行,創建awk文件要在頭部添加一行
#!/user/bin/awk -f
添加上可執行權限,就可以運行了。
[root@VM_79_126_centos ~]# cat ls_reverse.awk
#!/usr/bin/awk -f
BEGIN{
printf("%-12s%-8s%-13s%-5s%-8s%-5s%s\n",
"Filename","Time","Date","Size","Group","User","Link","Right");
printf("------------------------------------------------------------\n");
}
$1 !~/total/{
printf("%-12s%-8s%-13s%-5s%-8s%-5s%s\n"),$8,$7,$6,$5,$4,$3,$2,$1;
}
[root@VM_79_126_centos ~]# chmod +x ls_reverse.awk
[root@VM_79_126_centos ~]# ls -l |./ls_reverse.awk
Filename Time Date Size Group User Link
-------------------------------------------------------
21:15 23 Mar 4096 root root 2
08:31 8 Jun 92 root root 1
2015 20 Jan 2229 root root 1
14:50 21 Mar 4096 1000 1000 6
2013 22 Oct 143356root root 1
2015 21 Nov 4096 root root 2
11:38 8 Jun 294 root root 1
16:48 20 Mar 0 root root 1
16:22 20 Mar 0 root root 1
13:32 21 Mar 4096 games 501 7
21:53 17 Mar 1139175root root 1
16:59 23 Mar 4096 root root 2
01:05 8 Apr 0 root root 1
11:11 8 Jun 308 root root 1
17:29 23 Mar 4096 root root 2
21:13 23 Mar 4096 root root 3
22:52 7 Jun 184 root root 1
13:32 9 Dec 4096 root root 3
#可以看到和上面的reverse.sh差不多,只是將ls的命令拿到外面了
當然awk也能定義變量,awk還有一些內建變量可以直接調用,而且和shell腳本中的變量很類似,都是用來儲存一個值的。
awk的語法和C語言一樣,有循環,判斷等,有函數,用function定義。,
也有內建函數
FILENAME 當前正在處理的文件名,該變量不能在BEGIN塊中使用。
FNR 當前處理的記錄號
FS 字段的分隔符,默認爲空格。
IGNORECASE 如果該變量設置爲非0值,在進行字符串匹配時忽略大小寫。
NF 當前記錄中的字段個數
NR 已經讀出的記錄數
OFMT 數字的輸出格式
OFS 輸出的字段分隔符,默認爲空格
ORS 輸出的記錄分隔符,默認爲新行
RS 輸入記錄的分隔符,默認爲新行
int(expr) 取整函數(truncates integer)
sqrt(expr) 平方根函數(square root)
exp(expr) 指數函數(exponential)
log(expr)
自然對數函數(natural logarithm)
sin(expr) 正弦函數(sine)
cos(expr) 餘弦函數(cosine)
atan2(y, x) 反正切函數(arctangent
srand([expr]) 隨機數種子函數
rand() 隨機函數
[root@VM_79_126_centos ~]# cat CREDITS
----------
N: Jens Axboe
E: axboe@suse.de
D: Block/elevator/kiobuf hacking, IDE kiobuf support
S: Peter Bangs Vej 258, 2TH
S: 2500 Valby
S: Denmark
N: Ethan Benson
E: erbenson@alaska.net
D: Additional inode flags (immutable, append-only, etc)
S: P.O. Box 770525
S: Eagle River, AK 99577
S: Alaska
N: Nicolas Boullis
E: nboullis@debian.org
D: fix XFS recovery on 64-bit big-endian architectures
N: Danny Cox
E: danscox@mindspring.com
D: ACL port to Linux
N: Thomas Graichen
E: tgr@spoiled.org
D: Original XFS FAQ maintainer
D: PowerPC and Alpha porting
S: Berlin, Germany
[root@VM_79_126_centos ~]# sh line_record.sh
The developers of Linux Kernel:
(N)name,(E)email
----------------------
N: Jens Axboe
E: axboe@suse.de
N: Ethan Benson
E: erbenson@alaska.net
N: Nicolas Boullis
E: nboullis@debian.org
N: Danny Cox
E: danscox@mindspring.com
N: Thomas Graichen
E: tgr@spoiled.org
N: Juergen Hasch
E: hasch@t-online.de
[root@VM_79_126_centos ~]# cat line_record.sh
#!/bin/bash
awk '
BEGIN{
FS="\n"
RS=""
OFS="\n"
ORS="\n\n"
print "The developers of Linux Kernel:"
print "(N)name,(E)email"
print "----------------------"
}
/^N/{
print $1,$2;
}
' CREDITS
exit 0
遞歸的掃描文件下的所有文件,並將統計所有者的文件數
[root@VM_79_126_centos ~]# cat files_of_user.sh
#!/bin/bash
if [ $# != 1 ]
then
echo
echo "Count how many files belong to which user."
echo "Usage"
echo -e "\t `basename $0` [dictory]"
echo
exit 1
fi
ls -lR "$1" | awk '
function max(arr, i,max_number)
{
max_number=0;
for( i in arr )
{
if(arr[i]>max_number)
{
max_number=arr[i];
}
}
return max_number
}
function progress_length(currentlength,maxlength)
{
return currentlength/maxlength*50
}
BEGIN{
printf "%-10.10s %8s\n","User Name","File Numbers";
}
/^-/
{
result[$3]++
}
END{
max_length=max(result);
for(user in result)
{
printf "%-10.10s[%8d]:",user,result[user];
for(i=1;i<progress_length(result[user],max_length);i++)
{
printf "#";
}
printf "\n";
}
}
'
exit 0
程序結果
[root@VM_79_126_centos ~]# sh files_of_user.sh pip-8.1.1
User Name File Numbers
root [ 279]:###########################################
501 [ 320]:#################################################
( 寫於2016年6月9日,http://blog.csdn.net/bzd_111)