Linux的awk命令

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章