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

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