shell中awk的用法
- 格式:doc
- 大小:12.35 KB
- 文档页数:2
awk调用shell命令在awk内部可利用管道和getline函数来调用shell命令,并可得到返回的具体结果,进行相应处理。
例子如下:1) {while ( ("ls" | getline) >0 )print}输出当前目录下的所有文件,并打印到标准输出上。
| 是管道,getline依次得到每一行的输出,赋值给$0,print打印到标准输出上2) 如果希望将输出赋值到另外一个变量中,而不是覆盖$0,可这样改写:{while ( ("ls" | getline name) >0 )print name}3) system命令可以把awk内部的变量传递到外面使用,比如:{system("echo ", $1)}打印$1的内容getline为awk所提供的输入指令.其语法如下 :语法由何处读取数据数据读入后置于getline var < file 所指定的 file 变量 var(var省略时,表示置于$0)getline var pipe 变量变量 var(var省略时,表示置于$0)getline 一次读取一行数据, 若读取成功则return 1, 若读取失败则return -1, 若遇到文件结束(EOF), 则return 0;本程序使用 getline 所 return 的数据来做为 while 判断循环停止的条件,某些awk版本较旧,并不容许使用者改变$0 之值. 这种版的awk 执行本程序时会产生 Error, 读者可于 getline 之后置上一个变量(如此, getline 读进来的数据便不会被置于 $0 ), 或直接改用gawk便可解决.awk 提供与 UNIX 用法近似的 pipe, 其记号亦为 "|". 其用法及含意如下 :awk程序中可接受下列两种语法:[a. 语法] awk output 指令 | "Shell 接受的命令"( 如 : print $1,$2 | "sort -k 1" )[b. 语法] "Shell 接受的命令" | awk input 指令( 如 : "ls " | getline)注 : awk input 指令只有 getline 一个.awk output 指令有 print, printf() 二个.在a 语法中, awk所输出的数据将转送往 Shell , 由 Shell 的命令进行处理.以上例而言, print 所输出的数据将经由 Shell 命令 "sort -k 1" 排序后再送往屏幕(stdout).上列awk程序中, "print$1, $2" 可能反复执行很多次, 其输出的结果将先暂存于 pipe 中,等到该程序结束时, 才会一并进行 "sort -k 1".须注意二点 : 不论 print $1, $2 被执行几次, "sort -k 1" 的执行时间是 "awk程序结束时", "sort -k 1" 的执行次数是 "一次".在 b 语法中, awk将先调用 Shell 命令. 其执行结果将通过 pipe 送入awk程序,以上例而言, awk先让 Shell 执行"ls",Shell 执行后将结果存于 pipe, awk指令 getline再从 pipe 中读取数据.使用本语法时应留心: 以上例而言,awk "立刻"调用Shell 来执行"ls", 执行次数是一次.getline 则可能执行多次(若pipe中存在多行数据).除上列a, b 二中语法外, awk程序中其它地方如出现像"date", "cls", "ls"... 这样的字符串, awk只把它当成一般字符串处理。
高级Shell脚本编写技巧使用awk和sed进行文本处理和数据转换高级Shell脚本编写技巧:使用awk和sed进行文本处理和数据转换在Shell脚本编写中,awk和sed是两个常用的命令工具,它们可以高效地进行文本处理和数据转换。
本文将介绍一些使用awk和sed的高级技巧,帮助读者更好地利用这两个工具来处理文本和转换数据。
一、awk技巧1.基本语法awk是一种强大的文本处理工具,其基本语法为:awk 'pattern { action }' file其中,pattern是模式,决定是否对文本进行处理,action则是具体的处理动作。
file是需要处理的文件。
例如,要打印文件的第一列,可以使用以下命令:awk '{ print $1 }' file2.模式和动作在awk中,可以根据需求灵活组合模式和动作。
例如,要输出第一列大于100的行,可以使用以下命令:awk '$1 > 100 { print }' file3.内置变量awk提供了许多内置变量,用于方便地处理文本。
例如,$0表示整行文本,$1、$2等表示第n列,NF表示列数,NR 表示行号等。
可以利用这些内置变量来编写更加灵活的命令。
4.awk函数awk还提供了一些内置函数,用于处理文本。
例如,substr函数用于截取子字符串,length函数用于返回字符串长度等。
可以根据需要选择合适的函数来处理文本数据。
二、sed技巧1.基本语法sed是一种流编辑器,其基本语法为:sed 'pattern { action }' file其中,pattern是模式,决定是否对文本进行处理,action则是具体的处理动作。
file是需要处理的文件。
例如,将文件中所有的"apple"替换为"orange",可以使用以下命令:sed 's/apple/orange/g' file2.替换操作sed最常用的功能之一就是替换文本。
简介搜索支持正则,例如找root开头的: awk -F: '/^root/' /etc/passwd搜索/etc/passwd有root关键字的所有行,并显示对应的shell# awk -F: '/root/{print $7}' /etc/passwd/bin/bash这里指定了action{print $7}awk内置变量awk有许多内置变量用来设置环境信息,这些变量可以被改变,下面给出了最常用的一些变量。
ARGC 命令行参数个数ARGV 命令行参数排列ENVIRON 支持队列中系统环境变量的使用FILENAME awk浏览的文件名FNR 浏览文件的记录数FS 设置输入域分隔符,等价于命令行 -F选项NF 浏览记录的域的个数NR 已读的记录数OFS 输出域分隔符ORS 输出记录分隔符RS 控制记录分隔符此外,$0变量是指整条记录。
$1表示当前行的第一个域,$2表示当前行的第二个域,......以此类推。
统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容:#awk -F ':''{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwdfilename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/b in/bashfilename:/etc/passwd,linenumber:2,columns:7,linecontent:daemon:x:1:1:daemon:/usr /sbin:/bin/shfilename:/etc/passwd,linenumber:3,columns:7,linecontent:bin:x:2:2:bin:/bin:/bin/ shfilename:/etc/passwd,linenumber:4,columns:7,linecontent:sys:x:3:3:sys:/dev:/bin/ sh使用printf替代print,可以让代码更加简洁,易读awk -F ':''{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwdprint和printfawk中同时提供了print和printf两种打印输出的函数。
awk 引用shell变量,变量的作用域1. '' 单引号截断,注意:如果变量的值有空格的话,必须要加双引号"",否则空格会导致cmd空格option空格params2.ENVRION["varName"]3.-v传递参数1.格式如:awk‘{action}’变量名=变量值,这样传入变量可以在action中获得值,但不能在BEGIN{}中引用var1="hahah"echo |awk 'BEGIN{print "Begin:v1="v1} {print "ActionBody:v1="v1}' v1="$var1"输出结果Begin:v1=ActionBody:v1=hahaha2.格式如:awk –v 变量名=变量值[–v 变量2=值2 …] 'BEGIN{action}’注意:用-v 传入变量可以在3种类型的action 中都可以获得到,但顺序必须要在action前面。
echo |awk -v v1="haha" 'BEGIN{print "Begin:v1="v1} {print "ActionBody:v1="v1}' 输出结果Begin:v1=hahaActionBody:v1=haha格式如:awk ‘{action}’变量名=变量值,这样传入变量,可以在action中获得值。
注意:变量名与值放到’{action}’后面。
[chengmo@localhost ~]$ echo | awk 'BEGIN{print test}' test="$test"这种变量在:BEGIN的action不能获得。
awk -f "query.awk" idnums=10 test.dat必须要在文件名前面格式如:awk –v 变量名=变量值[–v 变量2=值2 …] 'BEGIN{action}’注意:用-v 传入变量可以在3中类型的action 中都可以获得到,但顺序在action前面。
awk是一种非常好的语言,同时有一个非常奇怪的名称。
在本系列的文章中,DanielRobbins 将使您迅速掌握 awk编程技巧。
随着本系列的进展,将讨论更高级的主题,最后将演示一个真正的高级awk 演示程序。
awk是一种很棒的语言。
awk 适合于文本处理和报表生成,它还有许多精心设计的特性,允许进行需要特殊技巧程序设计。
与某些语言不同,awk 的语法较为常见。
它借鉴了某些语言的一些精华部分,如 C 语言、python 和 bash(虽然在技术上,awk 比 python 和 bash 早创建)。
awk 是那种一旦学会了就会成为您战略编码库的主要部分的语言。
一. 第一个 awk让我们继续,开始使用 awk,以了解其工作原理。
在命令行中输入以下命令:$ awk '{ print }' /etc/passwd您将会见到 /etc/passwd 文件的内容出现在眼前。
现在,解释 awk 做了些什么。
调用 awk 时,我们指定 /etc/passwd 作为输入文件。
执行 awk 时,它依次对 /etc/passwd 中的每一行执行 print 命令。
所有输出都发送到 stdout,所得到的结果与与执行catting /etc/passwd 完全相同。
现在,解释 { print } 代码块。
在 awk 中,花括号用于将几块代码组合到一起,这一点类似于 C 语言。
在代码块中只有一条 print 命令。
在 awk 中,如果只出现 print 命令,那么将打印当前行的全部内容。
这里是另一个 awk 示例,它的作用与上例完全相同:$ awk '{ print $0 }' /etc/passwd在 awk 中, $0 变量表示整个当前行,所以 print 和 print $0 的作用完全一样。
如果您愿意,可以创建一个 awk 程序,让它输出与输入数据完全无关的数据。
Shell中的grep、awk和sed的常用命令和语法Shell中的grep、awk和sed的常用命令和语法——oid2000收集整理Grep的常用命令语法1. 双引号引用和单引号引用在g r e p命令中输入字符串参数时,最好将其用双引号括起来。
例如:―m y s t r i n g‖。
这样做有两个原因,一是以防被误解为s h e l l命令,二是可以用来查找多个单词组成的字符串,例如:―jet plane‖,如果不用双引号将其括起来,那么单词p l a n e将被误认为是一个文件,查询结果将返回―文件不存在‖的错误信息。
在调用变量时,也应该使用双引号,诸如:g r e p―$ M Y VA R‖文件名,如果不这样,将没有返回结果。
在调用模式匹配时,应使用单引号.[root@mypc ]# echo `grep 123 111.txt` (#注意是反单引号) 2. 常用的g r e p选项有:-c 只输出匹配行的计数。
-i 不区分大小写(只适用于单字符)。
-h 查询多文件时不显示文件名。
-l 查询多文件时只输出包含匹配字符的文件名。
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信息。
-v 显示不包含匹配文本的所有行。
3. 特殊的——在多个文件中进行查询$ grep "sort"*.doc ( #在当前目录下所有. d o c文件中查找字符串―s o r t‖)$ grep "sort it" * (#或在所有文件中查询单词―sort it‖)接下来的所有示例是指在单个文件中进行查询4. 行匹配$ grep -c "48" data.f$ 4 (#g r e p返回数字4,意义是有4行包含字符串―4 8‖。
)$ grep "48" data.f (#显示包含―4 8‖字符串的4行文本)5. 显示满足匹配模式的所有行行数:[root@mypc oid2000]# grep -n 1234 111.txt1:12343:1234ab6. 精确匹配[root@mypc oid2000]# grep "1234\>" 111.txt12347. 查询空行,查询以某个条件开头或者结尾的行。
⼀天⼀个shell命令linux⽂本内容操作系列-awk命令详解简介awk是⼀个强⼤的⽂本分析⼯具,相对于grep的查找,sed的编辑,awk在其对数据分析并⽣成报告时,显得尤为强⼤。
简单来说awk就是把⽂件逐⾏的读⼊,以空格为默认分隔符将每⾏切⽚,切开的部分再进⾏各种分析处理。
awk有3个不同版本: awk、nawk和gawk,未作特别说明,⼀般指gawk,gawk 是 AWK 的 GNU 版本。
awk其名称得⾃于它的创始⼈ Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓⽒的⾸个字母。
实际上 AWK 的确拥有⾃⼰的语⾔: AWK 程序设计语⾔,三位创建者已将它正式定义为“样式扫描和处理语⾔”。
它允许您创建简短的程序,这些程序读取输⼊⽂件、为数据排序、处理数据、对输⼊执⾏计算以及⽣成报表,还有⽆数其他的功能。
使⽤⽅法awk '{pattern + action}' {filenames}尽管操作可能会很复杂,但语法总是这样,其中 pattern 表⽰ AWK 在数据中查找的内容,⽽ action 是在找到匹配内容时所执⾏的⼀系列命令。
花括号({})不需要在程序中始终出现,但它们⽤于根据特定的模式对⼀系列指令进⾏分组。
pattern就是要表⽰的正则表达式,⽤斜杠括起来。
awk语⾔的最基本功能是在⽂件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进⾏其他⽂本操作。
完整的awk脚本通常⽤来格式化⽂本⽂件中的信息。
通常,awk是以⽂件的⼀⾏为处理单位的。
awk每接收⽂件的⼀⾏,然后执⾏相应的命令,来处理⽂本。
调⽤awk有三种⽅式调⽤awk说明:awk被设计⽤于数据流,能够对列和⾏进⾏操作。
⽽sed更多的是匹配,进⾏替换和删除。
awk有很多内建的功能,⽐如数组,函数等。
灵活性是awk的最⼤优势。
awk的结构awk 'BEGIN{ print "start"}pattern { commands }END{ print "end"}'file为了偏于观看,我打了回车,实际上是⼀⾏⼀个awk脚本通常是3部分1. BEGIN语句块2. 能够使⽤模式匹配的通⽤语句块3. END语句块他们任何⼀部分都可以不出现在脚本中。
Linux Shell中awk命令的用法awk命令awk也是一个数据处理工具!相较于 sed 常常作用于一整个行的处理, awk 则比较倾向于一行当中分成数个字段来处理。
.awk语言的最基本功能是在文件或字符串中基于指定规则来分解抽取信息,也可以基于指定的规则来输出数据。
有三种方式调用awk1.命令行方式awk [-F field-separator] 'commands' input-files其中,[-F域分隔符]是可选的,因为awk使用空格或tab键作为缺省的域分隔符,因此如果要浏览域间有空格的文本,不必指定这个选项,如果要浏览诸如passwd文件,此文件各域以冒号作为分隔符,则必须指明-F选项,如:awk -F: 'commands' input-file。
注:在linux系统中用环境变量IFS存储分隔符,但根据实际应用也可以改变IFS的值.例如:脚本执行结果如下:commands 是真正awk命令, input-files 是待处理的文件。
iput_files可以是多于一个文件的文件列表,awk将按顺序处理列表中的每个文件。
在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。
通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格或tab键。
2.shell脚本方式将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用。
相当于shell脚本首行的:#!/bin/sh可以换成:#!/bin/awk3.将所有的awk命令插入一个单独文件,然后调用:Awk -f awk-script-file input-files其中,-f选项加载awk-script-file中的awk脚本,input-files跟上面的是一样的。
awk的模式和动作任何awk语句都由模式和动作组成(awk_pattern { actions })。
shell中打印第一列的方法在Shell中,你可以使用各种方法来打印文本文件或数据流的第一列。
以下是一些常见的方法:1. 使用awk命令:```bashawk '{print $1}' filename```在这里,`$1`表示第一列,`filename`是你要处理的文件名。
2. 使用cut命令:```bashcut -d ' ' -f 1 filename```这里,`-d ' '`定义了字段分隔符为空格,`-f 1`表示输出第一列。
3. 使用sed命令:```bashsed -n 's/^\([^ ]\)./\1/p' filename```这会打印出每一行的第一个字段。
4. 使用head和tail组合:```bashhead -n 1 filename tail -n 1```这会打印文件的第一行,假设第一列是你想要的。
这并不是最优雅的方法,但对于某些简单情况可能很有用。
5. 使用printf:如果你的数据存储在变量中,你可以使用printf来打印第一列:```bashprintf -v var_name '%s' "$your_data" awk '{print $1}'```6. 使用perl:如果你熟悉perl,这是一个简单的方法来打印第一列:```bashperl -lane 'print $F[0]' filename```7. 使用python:你也可以使用Python来完成这个任务:```bashpython -c "import sys; print(().split()[0])" < filename```8. 使用bash的内置功能:如果你只是想处理简单的文本数据,可以考虑使用bash的内置功能,如IFS(内部字段分隔符):```bashwhile IFS=' ' read -r col1 _; do echo "$col1"; done < filename ```或者,对于以制表符分隔的数据:```bashwhile IFS=$'\t' read -r col1 _; do echo "$col1"; done < filename ```根据你的具体需求和场景,选择最适合你的方法。
shell数值操作(四则运算,浮点数,科学计数法)---awk,bc 1两个⽂件对应⾏的数值进⾏数值计算#!/bin/bash#use awk to handle Scientific notation#use bc to handle floatfor loop in 1dod=`ls ./performance.v1/${loop}thread/*.ori `for f in $ddoecho $fline=`cat $f | wc -l`rm ${f}-minus# for ((i=1;i<=$line;i++))for i in `seq $line`dofile1=` awk '{ if(NR=='"$i"') print $2}' ${f} `#NR代表⾏号echo $file1file2=` awk '{ if(NR=='"$i"') print $2}' ${f/v1/v2/} `# 字符串替换 ${f/v1/v2/} `echo $file2if echo $file1 | grep "E"thenresult=`echo "$file1 $file2" | awk '{print "%f",$1-$2}'`# awk可以对科学计数法进⾏计算echo $result>>${f}-minusecho "result"elseresult=` echo "$file1 - $file2" | /home/xuanji/bc-1.06/bc/bc`#bc可以处理浮点数echo $resultecho "result"echo $result >>${f}-minusfidonedonedone2 参考代码:shell脚本,⼀⾏⼀⾏⽐较两个⽂本⽂件。
Shell系列(22)-字符截取命令awk简介awk是⼀个数据处理⼯具,相⽐于sed常常作⽤于⼀整⾏的处理,awk则⽐较倾向于将⼀⾏分成数个”字段“来处理awk的流程是依次读取每⼀⾏数据,读取完⼀⾏数据后,进⾏条件判断,如果满⾜条件,就执⾏该条件对应的动作,没有条件直接执⾏动作其中⽂件名为$0,剩下的每⼀列依次为$1\$2...,判断完⼀⾏后,继续判断下⼀⾏,直到知道⽂件全部判断完对⽐cut⽽⾔,awk可以对以空格为分隔符进⾏操作;可以进⾏条件判断;另外字符截取针对有固定分隔符或者有规律的分隔符推荐使⽤cut命令awk命令格式awk '条件1{动作1}条件2{动作2}...' ⽂件名条件⼀般使⽤关系表达式作为条件x > 10判断变量x是否⼤于10x > =10⼤于等于x <= 10⼩于等于动作格式化输出printf流程控制语句if…do…done例⼦awk '{printf $2 "\t" $3 "\n"}' zifu1.text例⼦-任务任务:获取指定系统已⽤硬盘空间百分⽐命令:df -h:查看磁盘磁盘占⽤空间df -h | grep "/dev/sda":查看/dev/sda⽂件系统的磁盘占⽤空间df -h | grep "/dev/sda" | awk '{print $5}':显⽰/dev/sda⽂件系统的磁盘占⽤空间,只显⽰已⽤那⼀列的数据df -h | grep "/dev/sda" | awk '{print $5}' | cut -d "%" -f 1:显⽰/dev/sda⽂件系统的磁盘占⽤空间,只显⽰已⽤那⼀列的数据,不要百分⽐,只保留数字BEGINawk动作执⾏前操作,第⼀⾏显⽰或运⾏df -h | grep "/dev/sda" | awk 'BEGIN{print "这是sda已⽤空间"}{print $5}'ENDawk动作执⾏后的操作,最后⼀⾏显⽰或运⾏df -h | grep "/dev/sda" | awk 'END{print "这是sda已⽤空间"}{print $5}'FS内置变量awk分隔符默认TAB制表符以及空格,如果我们要指定分隔符就需要⽤到FS内置变量FS内置变量放在BEGIN⾥⾯#例⼦cat /etc/passwd | grep /bin/bash | awk '{FS=":"}{print $1 "\t" $3}'cat /etc/passwd | grep /bin/bash | awk 'BEGIN{FS=":"}{print $1 "\t" $3}关系运算符任务:打印成绩好的学⽣姓名命令:cat zifu1.text | grep -v "name" | awk '$4>60{print $2}'或cat zifu1.text | grep -v "name" \ 命令太长时,⽤换⾏符下划线\,切到下⼀⾏继续写#> | awk '$4>70{print $2}'。
shell awk match语法Shell Awk Match是一种在Shell编程中使用的强大工具,它通过匹配规则来处理文本数据。
在本文中,我们将详细介绍Shell Awk Match 语法,并提供一些实用的示例来帮助您更好地理解和应用。
一、Shell Awk Match基础知识Shell Awk Match是一种文本处理语言,它通过一系列的规则来匹配和处理文本数据。
Awk是一种完整的编程语言,但在Shell中,我们通常使用其匹配功能。
Awk匹配语法的一般形式如下:```awk '/pattern/ { action }' file```其中,`/pattern/`是一个用来匹配文本的模式,可以是一个字符串、正则表达式,或者是它们的组合。
`action`是要执行的动作,可以是打印、计算、修改等。
`file`是要处理的文本文件。
二、Awk匹配语法示例下面是一些常用的Awk匹配语法示例,帮助您更好地理解和使用Shell Awk Match。
1. 使用字符串匹配假设我们有一个名为`data.txt`的文本文件,包含如下内容:```applebananaorange```要匹配并打印出包含字符串“an”的行,可以使用如下的Awk命令:```awk '/an/ { print }' data.txt```执行结果将输出:```bananaorange```2. 使用正则表达式匹配假设我们有一个名为`data.txt`的文本文件,包含如下内容:```apple 100banana 200orange 150```要匹配并打印出第二列以1开头的行,可以使用如下的Awk命令:```awk '$2 ~ /^1/ { print }' data.txt```执行结果将输出:```apple 100```3. 组合多个模式假设我们有一个名为`data.txt`的文本文件,包含如下内容:```apple 100banana 200orange 150```要匹配并修改第二列大于100的行,将其置为0,可以使用如下的Awk命令:```awk '$2 > 100 { $2 = 0 } { print }' data.txt```执行结果将输出:```apple 0banana 0orange 0```三、Awk匹配语法高级应用除了基础的Awk匹配语法外,还有一些高级的用法,可以更灵活地处理文本数据。
shell实现groupby聚合操作统计在sql中,我们可以⽅便的使⽤group by及相应的聚合函数如sum avg count来实现分组统计需求,那当我们⾯对⼀个⽂本,在shell中也可以实现相应的功能吗?在shell中,我们主要⽤awk来实现类似的统计需求,如下我们⽤例⼦来解析说明。
数据准备[root ~]#cat tdata.txtapple 205.5pear 104.5apple 106.5我们以空格为分割符,创建⼀个⽔果类的售价及数量记录。
第⼀列为⽔果名name,第⼆列为数量num,第三列为单价price。
数据初探,输出各列的数据在进⾏awk操作之前,⼀般待处理的⽂本⽂件⾏数都⽐较多,列数也多,⽽当我们指定不同的分割符时,每个字段究竟输出在第⼏列有可能数起来也会有点⿇烦,所以此时⼀般先拿第⼀⾏做下各字段对应值输出,⽅便后续的对指定列的处理awk的语法格式为:pattern { action },对输⼊数据⼀⾏⾏处理。
只有满⾜只定的pattern表达式,后⾯的action才会进⾏处理,如默认的BEGIN END,还有⽤户⾃定义的各种表达式判断条件。
当未指定分割符时,默认以空⽩符作为分割。
NR NF是awk中的内置参数,NR代表当前⽂件处理到第⼏⾏,NF代表每⾏分割后的字段数。
[root ~]#awk'NR==1{for(i=1;i<=NF;i++){print "$"i,"=", $i}}' tdata.txt$1 = apple$2 = 20$3 = 5.5这样我就就知道了$1 $2到$NF对应的输出值,对我们后续要对指定哪列进⾏分析提供位置参考,当然我们也可以指定另外的分割符看下,-F参数⽤于指定分割符。
[root ~]#awk -F'.''NR==1{for(i=1;i<=NF;i++){print "$"i,"=", $i}}' tdata.txt$1 = apple 205$2 = 5有了对数据的基本感知,我们就可以进⼀步来处理数据了。
shell⾥awkprint的⽤法详解⾸先,你需要先了解awk 的⼯作原理:1。
AWK读取输⼊⽂件⼀次⼀⾏。
2。
对于每⼀⾏,它匹配在给定的顺序模式,如果匹配,执⾏相应的动作。
3。
如果没有模式匹配,将执⾏任何⾏动。
4。
在上⾯的语法,⽆论是搜索模式,或⾏动是可选的,但不能同时。
5。
如果没有给出搜索模式,然后awk要执⾏每⼀⾏输⼊给定的⾏动。
6。
如果没有给出动作,打印,这是默认的操作与模式相匹配的所有⾏。
7。
空出的任何⾏动括号什么都不做。
它不会执⾏默认的打印操作。
8。
中的每个⾏动的声明应该⽤分号分隔。
让我们创建employee.txt⽂件,其中有⾸先,你需要先了解awk 的⼯作原理:1。
AWK读取输⼊⽂件⼀次⼀⾏。
2。
对于每⼀⾏,它匹配在给定的顺序模式,如果匹配,执⾏相应的动作。
3。
如果没有模式匹配,将执⾏任何⾏动。
4。
在上⾯的语法,⽆论是搜索模式,或⾏动是可选的,但不能同时。
5。
如果没有给出搜索模式,然后awk要执⾏每⼀⾏输⼊给定的⾏动。
6。
如果没有给出动作,打印,这是默认的操作与模式相匹配的所有⾏。
7。
空出的任何⾏动括号什么都不做。
它不会执⾏默认的打印操作。
8。
中的每个⾏动的声明应该⽤分号分隔。
让我们创建employee.txt⽂件,其中有以下内容,这将是在使⽤下⽂提到的例⼦。
$cat employee.txt100 Thomas Manager Sales $5,000200 Jason Developer Technology $5,500300 Sanjay Sysadmin Technology $7,000400 Nisha Manager Marketing $9,500500 Randy DBA Technology $6,000Awk的范例1。
awk的默认⾏为默认情况下的awk打印⽂件的每⼀⾏。
1234567$ awk '{print;}' employee.txt100 Thomas Manager Sales $5,000200 Jason Developer Technology $5,500300 Sanjay Sysadmin Technology $7,000400 Nisha Manager Marketing $9,500500 Randy DBA Technology $6,000在上⾯的例⼦中模式中没有给出。
球体表⾯随机均匀采样⽅法shell 程序(awk )⼀个简单的均匀采样⽅法是:三维笛卡尔坐标系中⽣成随机点,并投影到球⾯上,这样⽣成的点才会均匀。
即⽣成三个⾼斯随机变量,x , y ,和z ,那么以下变量在三维球⾯上均匀分布的(Muller 1959, Marsaglia 1972):在shell脚本中写⼀个awk函数即可实现,以下代码实现随机选取两个点,输出它们的经纬度和⼤圆弧距离,输出五列单位均为度。
备注:seed代表最终⽣成⽂件⼤致⾏数norma代表A点到球⼼距离normb代表B点到球⼼距离dis代表AB点之间弦长arc代表AB点之间⼤圆弧长(度为单位)ReferencesMarsaglia, G. "Choosing a Point from the Surface of a Sphere." Ann. Math. Stat. 43, 645-646, 1972.Muller, M. E. "A Note on a Method for Generating Points Uniformly on N-Dimensional Spheres." Comm. Assoc. Comput. Mach. 2, 19-20, Apr. 1959.,弧noun: 弧, 弧形, 弧光 1 seed=100002 sum =$(echo $seed*36/3.1416/3.1416 | bc)3 awk 'BEGIN{srand();4 for ( i=0; i<='"$sum"'; i++ ){5 xa=2*rand()-1;6 ya=2*rand()-1;7 za=2*rand()-1;8 xb=2*rand()-1;9 yb=2*rand()-1;10 zb=2*rand()-1;11 norma=sqrt(xa*xa+ya*ya+za*za)12 normb=sqrt(xb*xb+yb*yb+zb*zb)13 if (norma<0.00001 || normb<0.00001) continue14 if (xa*xa+ya*ya+za*za<1.0 && xb*xb+yb*yb+zb*zb<1.0){15 xa=xa/norma16 ya=ya/norma17 za=za/norma18 xb=xb/normb19 yb=yb/normb20 zb=zb/normb21 dis=sqrt((xb-xa)^2+(yb-ya)^2+(zb-za)^2)22 lona=atan2(ya,xa)/0.01745323 lonb=atan2(yb,xb)/0.01745324 lata=90-atan2(sqrt(xa*xa+ya*ya),za)/0.01745325 latb=90-atan2(sqrt(xb*xb+yb*yb),zb)/0.01745326 arc=2*atan2(dis/2,sqrt(1-dis*dis/4))/0.01745327 printf("%8.2f %7.2f %8.2f %7.2f %8.3f\n",28 lona,lata,lonb,latb,arc)29 }30 }31 }' > sphere_random_point.txt。
shell脚本,提取⽂件中的内容使⽤awk、cut、sed、if、while 等awk、cut、sed还是很重要的这是后来修改的,可以完成#!/bin/bash#conver formatFILE=mobile_dpi.rulesAPPFILE=app_dic.rc.BAK_2CONVERFILE=mobile_dpi.txtrm -rf ${CONVERFILE}cat ${FILE} | grep "^a" | while read -r LINEdoPROTO_TYPE=$( echo $LINE | awk '{print $2}' )DIR=$( echo $LINE | awk '{print $4 $5 $6}' )STR=$(echo $LINE | awk -F '>' '{for(i=2;i<=NF;i++) printf $i}')TMPSTR=xVAR=1CONTENTEXPRESS=""PCREEXPRESS=""MSG=""IDSTR=""while [ "$TMPSTR"x != ""x ]doTMPSTR=$(echo $STR | awk -F ';' '{i='"$VAR"'; print $i}')if [ "$(echo $TMPSTR | grep "msg:")"x != ""x ];thenMSG=$(echo $TMPSTR | awk -F '\"' '{print $2}')fiif [ "$(echo $TMPSTR | grep "app:id")"x != ""x ];thenIDSTR=$(echo $LINE | cut -d '$' -f 2 | cut -d '(' -f 2 | cut -d ')' -f 1 | cut -d ':' -f 1)ID=$(cat $APPFILE | grep $IDSTR | head -1 | awk -F ';' '{print $2}' )fiif [ "$(echo $TMPSTR | grep "pcre:")"x != ""x ];thenPCREEXPRESS=$(echo $TMPSTR | awk -F '\"' '{print $2}')fiCONTENT=""if [ "$(echo $TMPSTR | grep "content:")"x != ""x ];thenCONTENT=$(echo $TMPSTR | awk -F '\"' '{print $2}')if [ "$(echo $CONTENT | grep '|')"x != ""x ];thenSTR1=$(echo $CONTENT | cut -d '|' -f 1)CUTSTR=$(echo $CONTENT | cut -d '|' -f 2)STR2=$(echo $CONTENT | cut -d '|' -f 3)CUTSTR=$( echo $CUTSTR| awk '{for(i=1;i<=NF;i++) {printf("\\\\x%s",$i);}}' )CONTENT="${STR1}""${CUTSTR}""${STR2}"CONTENTEXPRESS="${CONTENTEXPRESS}""(.*)""${CONTENT}"elseCONTENTEXPRESS="${CONTENTEXPRESS}""(.*)""${CONTENT}"fifiVAR=$(($VAR+1))doneCONTENTEXPRESS=${CONTENTEXPRESS#\(.*\)}EXPRESS=""if [ "$PCREEXPRESS"x != ""x ];thenEXPRESS=$PCREEXPRESSelseEXPRESS=$CONTENTEXPRESSfiif [ "$EXPRESS"x != ""x ];thenecho "PROTOCOL:${PROTO_TYPE};DIR:C->S;ID:${ID};MSG:${MSG};EXPRESS:\"${EXPRESS}\"" >> ${CONVERFILE} fidone这是之前的,⽐较乱#!/bin/bash#conver formatFILE=mobile_dpi.rulesAPPFILE=app_dic.rc.BAK_2CONVERFILE=mobile_dpi.txtrm -rf ${CONVERFILE}cat ${FILE} | grep "^a" | while read LINEdoPROTO_TYPE=$( echo $LINE | awk '{print $2}' )DIR=$( echo $LINE | awk '{print $4 $5 $6}' )MSG=$(echo $LINE | cut -d '(' -f 2 | cut -d ')' -f 1 | awk -F ';' '{print $1}' | awk -F ':' '{print $2}')IDSTR=$(echo $LINE | cut -d '$' -f 2 | cut -d '(' -f 2 | cut -d ')' -f 1 | cut -d ':' -f 1)ID=$(cat $APPFILE | grep $IDSTR | head -1 | awk -F ';' '{print $2}' )EXPRESTR=$(echo $LINE | awk -F '(' '{for(i=1;i<=NF;i++) printf $i}' | awk -F ';' '{for(i=2;i<=NF-2;i++)printf $i";"}')HEAD=$(echo $EXPRESTR | awk -F ';' '{print $1}' | awk -F '\"' '{print $1}')if [ "$HEAD"x == "pcre:"x ]; thenEXPRESS=$(echo $EXPRESTR | awk -F ';' '{print $1}' | awk -F '\"' '{print $2}')elseEXPRESS=$(echo $EXPRESTR | awk -F '\"' '{i=1;for(i=i*2;i<=NF;i+=2)printf $i"{?}"}')STRTMP=$(echo "$EXPRESS" |grep '|')if [ $? -eq 0 ];thenecho $EXPRESS# EXPRESS=$(echo $EXPRESS| awk -F '|' '{for(i=2;i<=NF;i+=2) printf $i"{?} " }'| awk '{for(i=1;i<=NF;i++){printf("\\\\x%s",$i)}}') fiEXPRESS=${EXPRESS%%\{?\}}fiecho "PROTOCOL:${PROTO_TYPE};DIR:C->S;ID:${ID};MSG:${MSG};EXPRESS:\"${EXPRESS}\"" >> ${CONVERFILE} done。
shell中awk的用法
在shell中,awk是非常常用的文本处理工具,它可以用来对文本进行格式化、过滤、统计等操作。
下面介绍一些常用的awk命令: 1. 基本语法
awk 'pattern {action}' filename
其中,pattern是匹配规则,action是对匹配到的行进行的操作,filename是要处理的文件名。
2. 打印整行
awk '{print}' filename
上面的命令会将文件中的每一行都打印出来。
3. 按列打印
awk '{print $1,$2}' filename
上面的命令会将文件中每一行的第一列和第二列打印出来。
4. 过滤行
awk '/pattern/{print}' filename
上面的命令会将文件中匹配到pattern的行打印出来。
5. 过滤列
awk '{print $1,$3}' filename
上面的命令会将文件中每一行的第一列和第三列打印出来。
6. 计算行数
awk 'END{print NR}' filename
上面的命令会统计文件中的行数并打印出来。
7. 计算列数
awk '{print NF}' filename
上面的命令会统计文件中每一行的列数并打印出来。
8. 求和
awk '{sum+=$1} END{print sum}' filename
上面的命令会将文件中第一列的数值求和并打印出来。
9. 求平均值
awk '{sum+=$1} END{print sum/NR}' filename 上面的命令会将文件中第一列的数值求平均值并打印出来。
以上是一些常用的awk命令,可以根据需求进行灵活应用。