简介 awk 报告生成器,作用格式化文本输出: awk分为awk.nawk. gawk。 但是linux上的awk为gawk [root@web1 base]# which awk /usr/bin/awk [root@web1 base]# ll /usr/bin/awk lrwxrwxrwx . 1 root root 4 Jul 26 10:57 /usr/bin/awk -> gawk 基本用法 gawk [options] ‘program’ FILE … program:
shell 的世界里有两个好兄弟:sed 和 gawk. 今天讲 gawk. gawk in 1986. -W keyword: 指定 gawk 的兼容模式或警告等级 gawk 的命令编程 gawk 的中心是其命令,可以有两种方式来调用命令 命令行的调用方式; 将多行命令编写在文件的调用方式 命令行的调用方式 ' _ 要注意的是两点: '{}' 成为 gawk 的固定格式,{} 是放置 gawk 命令的地方,而'' 是将命令当做字符串与其他选项或参数字符串隔离的分隔符。 [root@centos00 _data]# gawk 'print "hello, world!" ' gawk: cmd. line:1: print "hello, world!"
Gawk 软件包包含操作文本文件的程序。 安装 Gawk 解压软件包 echo $LFS cd $LFS/sources tar xf gawk-5.1.0.tar.xz cd gawk-5.1.0 首先,确保不要安装一些没有必要的文件: sed -i 's/extras//' Makefile.in 编译并安装 Gawk: time { . /config.guess) && make && make DESTDIR=$LFS install;} 安装完成后清理工作: cd .. rm -rf gawk-5.1.0 ---- 本次分享到此结束啦
窍门:可以用.sed作为sed脚本文件的扩展名 19.1.2 gawk程序 它提供了一种编程语言而不只是编辑器命令,在gawk编程语言中,可以做: 1)定义变量保存数据 2)使用算术和字符串操作符来处理数据 1.gawk命令格式 gawk options program file 下面是可用选项的说明: -F fs 指定行中划分数据字段的字段分隔符 -f file 从指定的文件中读取程序 比如: $gawk ‘{print “hello, shell”}’ 因为没有指定文件名,所以这个gawk程序会从STDIN接收数据,运行时会一直等待从STDIN输入的文本。 从文件中读取程序 比如有个脚本test.gawk内容如下: {print $1 “’s home is ” $6} 用法: $gawk –F: -f test.gawk /etc/passwd test.gawk 在处理数据前运行脚本 gawk还允许指定程序脚本何时运行。 默认gawk会从输入中读取一行文本,然后针对该行的数据执行程序脚本。 有时候会需要在处理数据前运行脚本,BEGIN就是用来做这个的。
GAWK—— GAWK 即 GNU AWK,所有的 GNU/Linux 发行版都包括 GAWK,且 GAWK 完全兼容 AWK 与 NAWK。 AWK 可以做非常多的工作。 linux 默认安装了gawk,使用which gawk,如果输出/bin/gawk,说明已经安装了gawk,否则需要我们安装,可以使用 yum 包管理工具安装: [root]# yum install gawk 另外我们也可以通过源码编译的方式安装gawk: step 1——从可信的源下载源代码。 [jerry]$ wget http://ftp.gnu.org/gnu/gawk/gawk-4.1.1.tar.xz step 2——解压并提取下载的源代码。 你可以通过如下的命令来确认 awk 安装成功: gawk的版本通过: gawk --version 查看 [jerry]$ which awk 执行上面的命令,你将会得到如下的结果: /usr/bin/
gawk是一门功能丰富的编程语言,你可以通过它所提供的各种特性来编写好几程序处理数据。 22.1 使用变量 gawk编程语言支持两种不同类型的变量: 内建变量和自定义变量 22.1.1 内建变量 gawk程序使用内建变量来引用程序数据里的一些特殊功能 1.字段和记录分隔符变量 数据字段变量 注意: 1)在shell脚本中使用gawk时,应该将gawk的命令放到不同的行,便于理解和阅读 2)如果在不同的shell脚本中使用了相同的gawk脚本,应该把gawk放在一个单独的文件中。 用来排除正则表达式中的匹配 $ gawk -F: '$1 ! ); print "x =",x}' $ gawk 'BEGIN{x=int(10*rand()); print "x =",x}' $ gawk 'BEGIN{x=and(1,2); print
awk最原始的版本是1977年在AT&T贝尔实验室诞生的,awk经过改进生成的新的版本nawk,gawk,现在默认linux系统下日常使用的是gawk。 我们可以看到: [awk@GeekDevOps ~]$ ls -l /bin/*awk lrwxrwxrwx. 1 root root 4 11月 20 10:41 /bin/awk -> gawk with include files 不太确信以上结果,我又使用man、info挨个看了一下,结果awk、gawk、dgawk、pgawk都是gawk,在线手册一模一样。 唯独igawk与前面四个不太一样,是包含文件的gawk,其实也是gawk。awk是gawk的一个软连接,大家都是gawk! 四、awk的使用 4.1 理解awk的工作原理 ? 五、参考资料 https://www.tutorialspoint.com/awk/index.htm https://www.gnu.org/software/gawk/manual/gawk.html
slurm gawk使用指南:https://www.gnu.org/software/gawk/manual/gawk.html#Functions ? gawk 鸟哥的linux私房菜:http://linux.vbird.org/linux_basic/ ?
gawk程序用ERE引擎来处理它的正则表达式模式。 $echo “bt” | gawk ‘/be?t/{print $0}’ $echo “bet” | gawk ‘/be?t/{print $0}’ $echo “beet” | gawk ‘/be? t/{print $0}’ $echo “bat” | gawk ‘/b[ae]?t/{print $0}’ $echo “baet” | gawk ‘/b[ae]? 注意:默认情况下gawk程序不识别正则表达式间隔。必须指定gawk程序的 –re-interval命令行选项才能识别正则表达式间隔。 例子: $echo “bt” | gawk –re-interval ‘/be{1}t/{print $0}’ // 指定出现1次e $echo “bet” | gawk –re-interval ‘
./ lrwxrwxrwx 1 root root 13 Dec 2 12:40 awk -> /usr/bin/gawk* lrwxrwxrwx 1 root root 29 Dec 2 12:40 awk.1.gz -> /usr/share/man/man1/gawk.1.gz lrwxrwxrwx 1 root root 38 Dec 2 12:38 builtins.7 link currently points to /usr/bin/gawk link awk is /usr/bin/awk slave awk.1.gz is /usr/share/man/ - priority 10 slave awk.1.gz: /usr/share/man/man1/gawk.1.gz slave nawk: /usr/bin/gawk slave nawk .1.gz: /usr/share/man/man1/gawk.1.gz /usr/bin/mawk - priority 5 slave awk.1.gz: /usr/share/man/man1
/bin/bash a=$[14*(`cat out.log | grep epon-onu | gawk '{print $4}' | sed '2,$d' | sed 's/\(.*\)1\/1\/ //' | sed 's/:\(.*\)//'`-1)+`cat out.log | grep epon-onu | gawk '{print $4}' |sed '2,$d' |sed 's/\(.* \)://'`] b=$[112+14*(`cat out.log | grep epon-onu | gawk '{print $4}' | sed '2,$d' | sed 's/\(.*\)1\/ 2\///' | sed 's/:\(.*\)//'`-1)+`cat out.log | grep epon-onu | gawk '{print $4}' |sed '2,$d' |sed 's/\
${tospc}%" echo "Old Generation: ${oldge}%" echo "Perm Generation: ${perm}%" eden1=`gawk -v x=$eden -v y=1000 'BEGIN{printf "%.0f\n",x*y}'` from1=`gawk -v x=$from -v y=1000 'BEGIN{printf "% .0f\n",x*y}'` tospc1=`gawk -v x=$tospc -v y=1000 'BEGIN{printf "%.0f\n",x*y}'` oldge1=`gawk -v x=$oldge -v y=1000 'BEGIN{printf "%.0f\n",x*y}'` perm1=`gawk -v x=$perm -v y=1000 'BEGIN{printf "%.0f\n",x*y}
awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk。gawk 是 AWK 的 GNU 版本。 用法:awk [options] '{script}' file。
--traditional 选项 该选项会禁止所有的gawk规范的扩展。 --version 选项 输出版本号 ? 第一次I/O操作使用了|&操作符,gawk会创建一个到运行其它程序的子进程的双向管道,print的输出被写入到了subprogram的标准输入,而这个subprogram的标准输出在gawk中使用getline 注意:目前协同进程的标准错误输出将会和gawk的标准错误输出混杂在一起,无法单独获取标准错误输出。另外,I/O缓冲可能存在问题,gawk程序会自动的刷新所有输出到下游的协同进程的管道。 但是,如果协同进程没有刷新其标准输出的话,gawk将可能会在使用getline函数从协同进程读取输出的时候挂起,这就可能引起死锁。 我们可以使用close函数关闭双向管道的to或者from一端,这两个字符串值告诉gawk发送数据到协同进程完成时或者从协同进程读取完毕时关闭管道。
############################# REM - Target Domain IF EXIST target del target echo %userdnsdomain% | gawk "{print $%%G}" > %%G SET /p var%%G= < %%G gawk "BEGIN { while (a++<1) s=s \"dc=%%var%%G%%\"; print s "{print $%%G}" > %%G SET /p c_var%%G= < %%G gawk "BEGIN { while (a++<1) s=s \"dc=%%c_var%%G%%\"; print -F ":" "{print $2}" | gawk -F " " "{print $1}"| sort > users_ldap.txt echo . echo . echo Results have been exported to users_ldap.txt goto :END :DUMPUSERSSMB findpdc %userdomain% 1 >> pdc1.txt gawk -F
追加slowlog条目并格式化输出文件 redis-cli -p 20001 --no-raw slowlog get 128 | gawk '{ if($0~/1\) \(integer\)/) {$1 (/4\)/," ",$0);} {print $0}}' >> tmpfile.txt 说明: redis-cli命令行加--no-raw选项,目的是将get的原样输出到管道,便于gawk 完成这些工作的命令如下: gawk '/^1\)/{print s;s=""};{ s=(s" "$0)};END{print s } ' tmpfile.txt | sort | uniq | sed 's/ /\n /g' | gawk '/^ 1\) \(integer\)/{rc =rc+1;rowdata=rc") \t" $1" "$2" "$3"\n\t"$4 =tmp_slowlog_$1.txt /home/redis/redis-3.2.3/src/redis-cli -p $1 --no-raw slowlog get 128 | gawk
--traditional 选项 该选项会禁止所有的gawk规范的扩展。 第一次I/O操作使用了|&操作符,gawk会创建一个到运行其它程序的子进程的双向管道,print的输出被写入到了subprogram的标准输入,而这个subprogram的标准输出在gawk中使用getline 注意:目前协同进程的标准错误输出将会和gawk的标准错误输出混杂在一起,无法单独获取标准错误输出。另外,I/O缓冲可能存在问题,gawk程序会自动的刷新所有输出到下游的协同进程的管道。 但是,如果协同进程没有刷新其标准输出的话,gawk将可能会在使用getline函数从协同进程读取输出的时候挂起,这就可能引起死锁。 我们可以使用close函数关闭双向管道的to或者from一端,这两个字符串值告诉gawk发送数据到协同进程完成时或者从协同进程读取完毕时关闭管道。
/bin/bash muser=$1 logged_on=$(who | grep -i -m 1 $muser | gawk '{print $1}') #1) determine if exit fi #2) determine if user allows messages allowed=$(who -T | grep -i -m 1 $muser | gawk '{print whole_message' '$1 shift done # 4) Send message to user uterminal=$(who | grep -i -m 1 $muser | gawk 选项提取出另外 两行文本 grep "28, $(date +%Y)" -A2 | # xcy add sed 's/>//g' | # 删除> sed '/ /{n ; d}' | gawk
awk 有 3 个不同版本: awk、nawk 和 gawk,一般常用的就是 gawk,gawk 是 AWK 的 GNU 版本。我们这里演示的就是 gawk。
|head -1` #sleep 1 echo "-------->服务器$host检测已完成" #取成功条数 succ_ping=`echo $ping_result | gawk '{print $4}'` #取失败百分比 loss_ping=`echo $ping_result | gawk '{print $6}'` if [ $succ_ping