如何在Bash脚本中使用awk

时间:2020-01-09 10:37:25  来源:igfitidea点击:

如何在bash脚本下使用awk模式扫描和处理语言?

Awk是用于构建UNIX/Linux Shell脚本的出色工具。

AWK是一种编程语言,旨在处理文件或数据流中或使用Shell管道的基于文本的数据。
换句话说,您可以将awk与shell脚本结合使用,或直接在shell提示符下使用。

这些页面显示了如何在bash shell脚本中使用awk。

打印文本文件

awk '{ print }' /etc/passwd

或者

awk '{ print 
awk -F':' '{ print  }' /etc/passwd
}' /etc/passwd

打印特定字段

使用:作为输入字段分隔符,仅打印第一个字段,即用户名(将打印第一个字段。
所有其他字段均被忽略):

awk -F':' '{ print  }' /etc/passwd | sort

使用shell管道将输出发送到sort命令:

awk ' == 500 { print 
== != < > = ?:
}' /var/log/httpd/access.log

模式匹配

如果模式匹配,则只能打印文件的行。
例如如果HTTP错误代码为500(显示每个HTTP请求的第9个字段日志状态错误代码),则显示Apache日志文件中的所有行:

awk ' == 500 ' /var/log/httpd/access.log
awk ' == 500 {print} ' /var/log/httpd/access.log
awk ' == 500 {print 
awk '/tom|jerry|Hyman/' /etc/passwd
} ' /var/log/httpd/access.log

花括号外的部分称为样式,而花括号内的部分称为动作。
比较运算符包括C中的运算符:

awk "NR==1{print;exit}" /etc/resolv.conf
awk "NR==$line{print;exit}" /etc/resolv.conf

如果未提供任何模式,则该操作将应用于所有行。
如果未采取任何措施,则将打印整行。
如果单独使用打印,则会打印整行。
因此,以下内容等效:

awk '{total += } END {print total}' earnings.txt

包含tom,jerry和Hyman的打印线

在不同的行上打印图案:

awk 'BEGIN {printf "%.3f\n", 2005.50 / 3}'

从文件打印第一行

#!/bin/bash
d=
OUT=/tmp/spam.ip.$$
HTTPDLOG="/www/$d/var/log/httpd/access.log"
[ $# -eq 0 ] && { echo "Usage: 
chrootCpSupportFiles() {
# Set CHROOT directory name
local BASE=""         # JAIL ROOT
local pFILE=""        # copy bin file libs
 
[ ! -d $BASE ] && mkdir -p $BASE || :
 
FILES="$(ldd $pFILE | awk '{ print  }' |egrep -v ^'\(')"
for i in $FILES
do
  dcc="$(dirname $i)"
  [ ! -d $BASE$dcc ] && mkdir -p $BASE$dcc || :
  /bin/cp $i $BASE$dcc
done
 
sldl="$(ldd $pFILE | grep 'ld-linux' | awk '{ print }')"
sldlsubdir="$(dirname $sldl)"
if [ ! -f $BASE$sldl ];
then
        /bin/cp $sldl $BASE$sldlsubdir
else
        :
fi
}
domain-name"; exit 999; } if [ -f $HTTPDLOG ]; then awk '{print}' $HTTPDLOG >$OUT awk '{ print }' $OUT | sort -n | uniq -c | sort -n else echo "$HTTPDLOG not found. Make sure domain exists and setup correctly." fi /bin/rm -f $OUT

简单算术

您会在一列中得到所有数字的总和:

chrootCpSupportFiles /lighttpd-jail /usr/local/bin/php-cgi

Shell无法使用浮点数进行计算,但是awk可以:

history | awk '{print }' | sort | uniq -c | sort -rn | head

从Shell脚本调用AWK

一个shell脚本,用于列出访问您的网站的所有IP地址。
该脚本使用awk处理日志文件,并使用Shell脚本命令进行验证。

172 ls
    144 cd
     69 vi
     62 grep
     41 dsu
     36 yum
     29 tail
     28 netstat
     21 mysql
     20 cat

AWK和Shell函数

这是另一个例子。

chrootCpSupportFiles()找出每个程序所需的共享库(例如perl/php-cgi)或在命令行上指定的共享库,并将它们复制到目标位置。
此代码调用awk来打印来自ldd输出的选定字段:

$ whois theitroad.com | awk '/Registry Expiry Date:/ { print  }'

该函数可以如下调用:

2018-07-31T18:42:58Z

AWK和壳管

列出您最喜欢的10个命令:

awk -f mypgoram.awk input.txt

输出示例:

n1=5
n2=10
echo | awk -v x=$n1 -v y=$n2 -f program.awk

找出域到期日期的另一个示例:

BEGIN{ans=x+y}
{print ans}
END{}

输出示例:

##代码##

AWK程序文件

您可以将所有awk命令放入文件中,并使用以下语法从shell脚本中调用该命令:

##代码##

Shell脚本中的Awk将Shell变量传递给Awk

您可以使用-v选项将shell变量传递给awk:

##代码##

在程序开始执行之前,将值n1分配给变量x。
此类变量值可用于AWK程序的BEGIN块:

##代码##