如何在Bash脚本中使用awk
如何在bash脚本下使用awk模式扫描和处理语言?
Awk是用于构建UNIX/Linux Shell脚本的出色工具。
AWK是一种编程语言,旨在处理文件或数据流中或使用Shell管道的基于文本的数据。
换句话说,您可以将awk与shell脚本结合使用,或直接在shell提示符下使用。
这些页面显示了如何在bash shell脚本中使用awk。
打印文本文件
awk '{ print }' /etc/passwd
或者
awk '{ printawk -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 {printawk '/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块: