shell编程awk进阶

awk操作符

算术操作符:  x+y, x-y, x*y, x/y, x^y, x%y      -x: 转换为负数      +x: 转换为数值

字符串操作符:没有符号的操作符,字符串连接

赋值操作符: =, +=, -=, *=, /=, %=, ^=  ++, --

比较操作符: ==, !=, >, >=, <, <=

awk  -F:   ‘!($3==0) {print $1}‘   /etc/passwd

模式匹配符:  ~ 左边是否和右边匹配包含       !~ 是否不匹配

awk –F:   ‘$0 ~ /root/{print $1}‘    /etc/passwd

awk  –F:  ‘$3==0’       /etc/passwd

awk正则匹配表达式

(1)如果未指定:空模式,匹配每一行

(2) /regular expression/:仅处理能够模式匹配到的行,需要用/  /括起来

awk ‘/^UUID/{print $1}‘ /etc/fstab

(3) relational expression: 关系表达式,结果为“真”才会被处理

awk  ‘!0’  /etc/passwd

(4) line ranges:行范围

startline,endline:/pat1/,/pat2/ 不支持直接给出数字格式

awk -F:   ‘/^root\>/,/^nobody\>/{print $1}‘    /etc/passwd

(5) BEGIN/END模式

BEGIN{}: 仅在开始处理文件中的文本之前执行一次  END{}:仅在文本处理完成之后执行一次

awk控制语句

if-else   while循环  do-while循环   for循环  switch语句  break和continue

next:   提前结束对本行处理而直接进入下一行处理(awk自身循环)

awk -F: ‘{if($3%2!=0) next; print $1,$3}‘    /etc/passwd

awk 自带对文件行内容的循环,awk使用循环一般是对切割数据列进行循环操作

awk 的基本格式  awk -F:  ‘{}‘   filepath

性能比较

time (awk ‘BEGIN{ total=0;for(i=0;i<=10000;i++){total+=i;};print total;}‘)

time(total=0;for i in {1..10000};do total=$(($total+i));done;echo $total)

time(for ((i=0;i<=10000;i++));do let total+=i;done;echo $total)

time(seq –s ”+” 10000|bc)

awk数组

默认是关联数组

若要遍历数组中的每个元素,要使用for循环

for(var in array) {for-body}   注意:var会遍历array的每个索引

awk函数

数值处理:

rand():返回0和1之间一个随机数   awk  ‘BEGIN{srand(); for (i=1;i<=10;i++)print int(rand()*100) }‘

字符串处理:

echo $a | awk -F "" ‘{for(i=1;i<=NF;i++){if($i ~ /^[0-9]+$/) printf"%s", $i}}‘

length([s]):返回指定字符串的长度

sub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并将第一个匹配的内容替换为s

echo "2008:08:08 08:08:08" | awk ‘sub(/:/,“-",$1)‘

gsub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并全部替换为s所表示的内容

echo "2008:08:08 08:08:08" | awk ‘gsub(/:/,“-",$0)‘

split(s,array,[r]) 以r为分隔符,切割字符串s,并将切割后的结果保存至array所表示的数组中, 第一个索引值为1,第二个索引值为2

netstat -tan | awk ‘/^tcp\>/{split($5,ip,":");count[ip[1]]++} END{for (i in count) {print i,count[i]}}‘

自定义函数

awk中调用shell命令

system命令

空格是awk中的字符串连接符,如果system中需要使用awk中的变量可以使用 空格分隔,或者说除了awk的变量外其他一律用""引用起来。

awk BEGIN‘{system("hostname") }‘   awk BEGIN‘{system("ifconfig") }‘

awk ‘BEGIN{score=100; system("echo  your score is " score) }‘

awk传递值给shell循环,shell命令不能直接在awk的action中执行

#!/bin/bash
awk ‘/^[0-9]/{ip[$1]++}END{for(i in ip){if(ip[i]>30) print i}}‘ access_log | while read ip; do
      echo $ip
done 

awk脚本

将awk程序写成脚本,直接调用或执行

向awk脚本传递参数

格式:  awkfile  var=value var2=value2... Inputfile

注意:在BEGIN过程中不可用.直到首行输入完成以后,变量才可用.可以通 过-v 参数,让awk在执行BEGIN之前得到变量的值.

命令行中每一个指定的变 量都需要一个-v参数

awk实例

 1 awk ‘{for(i=1;i<=NF;i++){word[$i]++}}END{for(j in word){print j,word[j]}}‘ /etc/rc.sysinit
 2
 3 [[email protected] ~]# awk ‘{if($NF=="m"){sum_m+=$2;num_m++} else{sum_f+=$2;num_f++}}END{printf "male:%.2f\nfemale:%.2f\n",sum_m/num_m,sum_f/num_f}‘ score
 4 male:99.50
 5 female:95.00
 6 [[email protected] ~]# awk ‘{pcount[$3]++;s[$3]+=$2}END{for(i in pcount){print i, pcount[i],s[i]/pcount[i]}}‘ score
 7 m 2 99.5
 8 f 2 95
 9 [[email protected] ~]# echo "2008:08:08 :08" | awk ‘sub(/:/,"-",$1)‘
10 2008-08:08 :08
11 [[email protected] ~]# echo "2008:08:08 :08" | awk ‘gsub(/:/,"-",$1)‘
12 2008-08-08 :08
13 [[email protected] ~]# echo "2008:08:08:08" | awk ‘gsub(/:/,"-",$1)‘
14 2008-08-08-08
15 [[email protected] ~]# head -n1 /etc/passwd | awk ‘{split($0,arr,":")}END{for(i in arr){print i,arr[i]}}‘
16 4 0
17 5 root
18 6 /root
19 7 /bin/bash
20 1 root
21 2 x
22 3 0
23 [[email protected] ~]# netstat -an |awk ‘/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for(i in count){print i,count[i]}}‘
24 192.168.33.1 2
25 0.0.0.0 5

 1 awk -F: -v i=0 ‘i{print $0}‘ /etc/fstab
 2 [[email protected] ~]# awk ‘/^[^#]/‘ /etc/fstab
 3 UUID=1ec9c7b3-bec1-4998-9aad-057423419431 /                       xfs     defaults        0 0
 4 UUID=df74adc0-09cd-4a97-a1e4-9f0d4a4b5796 /boot                   xfs     defaults        0 0
 5 UUID=bacf4f88-3be9-4e74-ba5b-90274a2099ab /data                   xfs     defaults        0 0
 6 UUID=339ab167-206a-4210-a36d-8d575579959e swap                    swap    defaults        0 0
 7 [[email protected] ~]# awk ‘/^ *#/‘ /etc/fstab
 8 #
 9 # /etc/fstab
10 # Created by anaconda on Wed Mar 28 01:53:52 2018
11 #
12 [[email protected] ~]# awk -F: ‘/\/bin\/bash$/{print $1,$NF}‘ /etc/passwd
13 root /bin/bash
14 yanxianghui /bin/bash
15 tomcat /bin/bash
16 [[email protected] ~]# awk -F: ‘/^root\>/,/^mail\>/{print $1}‘ /etc/passwd
17 root
18 [[email protected] ~]# df -h | awk -F% ‘$0 ~ /^\/dev\/sd/{print $1}‘| awk ‘$5>=10‘
19 /dev/sda1      1014M  194M  821M  20
20 [[email protected] ~]# df -h | awk -F% ‘$0 ~ /^\/dev\/sd/{print $1}‘
21 /dev/sda2        50G  4.2G   46G   9
22 /dev/sda3        30G   82M   30G   1
23 /dev/sda1      1014M  194M  821M  20

1 [[email protected] ~]# awk ‘/^[0-9]/{ip[$1]++}END{for (i in ip){print i,ip[i]}}‘ access_log
2 172.20.101.111 2
3 172.20.101.238 19
4 172.20.101.188 6

原文地址:https://www.cnblogs.com/yxh168/p/9048107.html

时间: 2024-08-29 07:45:57

shell编程awk进阶的相关文章

shell编程awk基础介绍

awk介绍 报告生成器,格式化文本输出 处理机制类似sed命令,自带循环处理    读入一行处理一行然后自动读取下一行再进行处理 sed命令换行的标识是固定的,只能是回车换行.    awk里面的换行符是可以自定义的. awk自动把读入的行按照指定的切割符号切割成若干个字段   默认的切割符号是空白符号(包括连续的空白符号,tab键,回车换行符) 基础语法 awk  [options]   'program'  var=value    file awk  [options]  -f progr

Linux Shell编程 awk命令

概述 awk是一种编程语言,用于在linux/unix下对文本和数据进行处理.数据可以来自标准输入(stdin).一个或多个文件,或其它命令的输出.它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具.它在命令行中使用,但更多是作为脚本来使用.awk有很多内建的功能,比如数组.函数等,这是它和C语言的相同之处,灵活性是awk最大的优势. 命令的基本格式如下: [[email protected] ~]# awk '条件1 {执行语句 1} 条件 2 {执行语

Shell编程—gawk进阶

1使用变量 awk编程语言支持两种不同类型的变量: 内建变量 自定义变量 1.1内建变量 1. 字段和记录分隔符变量 数据字段变量允许你使用美元符号($)和字段在该记录中的位置值来引用记录对应的字段.因此,要引用记录中的第一个数据字段,就用变量$1:要引用第二个字段,就用$2,依次类推. 数据字段是由字段分隔符来划定的.默认情况下,字段分隔符是一个空白字符,也就是空格符或者制表符. gawk的内建变量: 变  量 描  述 FIELDWIDTHS 由空格分隔的一列数字,定义了每个数据字段确切宽度

Shell编程—sed进阶

1多行命令 sed编辑器包含了三个可用来处理多行文本的特殊命令. N:将数据流中的下一行加进来创建一个多行组来处理. D:删除多行组中的一行. P:打印多行组中的一行. 1.1next命令 1. 单行的next命令 小写的n命令会告诉sed编辑器移动到数据流中的下一文本行,而不用重新回到命令的 开始再执行一遍. $ cat data1.txt This is the header line. This is a data line. This is the last line. $ $ sed

shell编程进阶

Shell编程进阶 Shell结构以及执行 [[email protected] ~]# mkdir shell [[email protected] ~]# cd shell/ [[email protected] shell]# vim first.sh #!/bin/bash ##The first test shell script ##written by wangchao ls /tmp/ echo "This is the first script." [[email p

Shell编程之---awk命令详解

awk编程 awk是一种编程语言.gawk.是最新版本,当前的linux版本用的都是gawk awk是gawk的软链接 awk工作原理 BEGIN   #在未读取文件行之前执行 主输入循环 (main input loop),反复执行,直到终止条件触发 END     #在读取文件行完毕后执行 awk的三种调用方法 1.在shell命令行输入命令调用awk #awk [-f 域分隔符] 'awk cmd' file 2.在awk程序段插入脚本文件,然后通过awk命令调用他 #awk -f 'aw

《跟老男孩学Linux运维之shell编程实战》-第三章 shell变量知识进阶

本文讲解shell变量知识进阶. 以下为知识点的总结,关于练习,本文不不涉及,还需要各位小伙伴自己练习! 1.shell中的特殊位置参数变量,请见下表: 在企业场景下,"$?"的用法: (1)判断命令.脚本或函数等程序是否执行成功: (2)若在脚本中调用执行"exit 数字",则会返回这个数字给"$?"变量: (3)如果是在函数里,则通过"return  数字",把这个数字以函数返回值的形式传给"$?".

Shell编程进阶篇(完结)

1.1 for循环语句 在计算机科学中,for循环(英语:for loop)是一种编程语言的迭代陈述,能够让程式码反复的执行. 它跟其他的循环,如while循环,最大的不同,是它拥有一个循环计数器,或是循环变数.这使得for循环能够知道在迭代过程中的执行顺序. 1.1.1 shell中的for循环 shell中的for 循环与在c中不同,它包含三种形式:第一种结构是列表for 循环;第二种结构就是不带列表的for循环:第三种就类似于C语言. ①   列表for循环(常用) #!/bin/bash

Shell编程之正则表达式三剑客——awk工具

awk概述 在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于 Shell 脚本,完成各种自动化配置任务. 1,awk常见用法 通常情况下 awk 所使用的命令格式如下所示,其中,单引号加上大括号"{}"用于设置对数据进行的处理动作.awk 可以直接处理目标文件,也可以通过"-f"读取脚本对目标文件进行