①13题为什么选c,函数结束t不就背释放了吗,复制了有什么用②假设*s=&quot 如何转成引号;asd&quot 如何转成引号;,int b=a

以上内容摘取自《(机械电子工程专业论文)LAMOST光纤定位系统控制软件通讯模块的设计与研发.pdf》,若想查看原文格式,请如果您觉得不放心或未尽人意,请复制链接到电脑端访问(同时支持支付宝和微信支付)。记录黑客技术中优秀的内容, 传播黑客文化,分享黑客技术精华
上周六,Adobe又一次更新了Flash Player软件,这次更新的目的是修复被编号为CVE-的0day严重漏洞。这个漏洞是由知名安全研究人员Kafeine提交的。
该漏洞正被攻击者广泛的利用中,通过发动强迫下载(drive-by-download)攻击绝大部分Windows系统。该漏洞已被公司标记为了高危,也就意味着攻击者可以执行恶意代码,甚至是在用户完全不知情的情况下。
这个漏洞是Flash长期存在的未公开漏洞,允许攻击者远程获取PC控制权;Windows、OS X及Linux的Flash版本都包含该漏洞。
我们分析截获的样本后发现,实际Flash文件被嵌入到一个经过高强度混淆的恶意.SWF文件内。剥离混淆代码后,我们全面的分析了漏洞并发现了Exp的运行方式。
在介绍细节之前,分享一下我们的“神秘”发现:这些代码片段竟与CVE-的漏洞利用代码颇有几分相似之处。这两个漏洞利用代码极有可能出自同一黑客之手。
分析发现这是一个UAF类型的漏洞。这种情况下,domainMemory引用的内存会被释放掉,攻击者能够读写内存甚至执行任意代码。
漏洞触发的步骤如下:
1.创建一个ByteArray实例并写入大量数据,然后压缩实例内容。
图 1. ByteArray 创建代码
2.从0×200开始覆盖ByteArray的压缩数据并将ByteArray赋予domainMemory。
图 2. 覆盖 ByteArray
3.解压ByteArray的数据。因为上一步的操作,程序将抛出IOError异常。代码捕获异常然后用另一ByteArray保存释放后的内存地址,接下来ByteArray被0xBBBBBBBB填充。
图 3. IOError与异常捕获
4.清除ByteArray内的占位符数据。
图 4. 释放ByteArray内存
为什么domainMemory仍引用未压缩的数据缓冲区?
在AvmPlus项目代码中,我们在ByteArray::UncompressViaZlibVariant函数中发现了漏洞所在。函数是这样设计的:首先它会分配一个缓冲区来存储未经压缩的数据,如果解压缩成功,它会通知domainMemory使用新的缓冲区。如果解压缩失败,它将不通知domainMemory使用新缓冲区同时释放新申请的缓冲区。
这看上去是无可非议的,好戏还在后面。在解压缩的过程中,新分配的缓冲区会变大。类Grower控制缓冲区的动态增长,增长结束后,类Grower的析构函数通知domainMemory使用扩展缓冲区。最终domainMemory在解压过程中使用了新的缓冲区,如果解压失败,新创建的缓冲区将被释放。这就打乱了原来ByteArray::UncompressViaZlibVariant的逻辑:解压缩失败,domainMemory却使用了新的缓冲区。
这就是经过上面的步骤,domainMemory指向填充0xBBBBBBBB的被释放内存空间的原因,到这一步,Exp已经可以通过使用内部指令来读写这块被释放的内存空间了。
图 5. 读被释放的内存空间
与最近的大部分Flash漏洞利用代码类似,这个Exp通过控制内存布局将攻击向量置入被释放的内存并覆盖攻击向量的长度标识,从而达到任意读取和写入内存的目的。
图 6. 覆盖内存
很明显,内存布局在解压缩过程中被改变了,向量长度也被覆盖(见下图)。在我的调试环境中,UAF内存地址为0×。
图 7. 解压缩后的内存布局(头部信息已经被成功解压)
图 8. 0xBBBBBBBB覆盖ByteArray后的内存布局
图 9. ByteArray释放后的内存布局和攻击向量
图 10. 攻击向量长度被覆盖后的内存布局
攻击向量长度被覆写为0×后,示例代码就能任意读写内存;此时的内存容量也足以执行任意代码了。
接下来Exp只需要触发一个伪造的虚函数即可完成全部利用过程。
说好的CVE- EXP
安全脉搏sev7n附上CVE- exp,
swf下载地址:核心代码:&
【原文: 翻译:
转载请注明: &
阅读:31286 | 评论:0 | 标签:
想收藏或者和大家分享这篇好文章→
? 关注Hackdig微博,点击下方按钮?
? 关注Hackdig微信,学习技术更方便您正在浏览:
awk的用法a w k语言的最基本功能是在文件或字符串中基于指定规则浏览和抽取信息 调用awk有三种方式调用a w k,第一种是命令行方式,如: & & awk –F : ‘commands’ input-files & &第二种方法是将所有a w k命令插入一个文件,并使a w k程序可执行,然后用a w k命令作为脚本的首行,以便通过键入脚本名称来调用它。第三种方式是将所有的a w k命令插入一个单独文件,然后调用:awk –f awk-script-file input-files awk脚本模式和动作在命令中调用a w k时,a w k脚本由各种操作和模式组成。模式包括两个特殊字段B E G I N和E N D。使用B E G I N语句设置计数和打印头。B E G I N语句使用在任何文本浏览动作之前。E N D语句用来在a w k完成文本浏览动作后打印输出文本总数和结尾状态标志。实际动作在大括号{ }内指明。 域和记录$ 0,意即所有域 o 确保整个a w k命令用单引号括起来。o 确保命令内所有引号成对出现。o 确保用花括号括起动作语句,用圆括号括起条件语句。 awk中的正则表达式+ 使用+匹配一个或多个字符。? 匹配模式出现频率。例如使用/X Y?Z/匹配X Y Z或Y Z。 awk '{if($4~/Brown/) print $0}' tab2等效于awk '$0 ~ /Brown/' tab2 内置变量awk '{print NF,NR,$0}END{print FILENAME}' tab1NF 域的总数NR已经读取的记录数FILENAME awk '{if(NR&0 && $2~/JLNQ/) print $0}END{print FILENAME}' tab1 显示文件名echo &/app/oracle/ora_dmp/lisx/tab1& | awk -F/ '{print $NF}' 定义域名awk '{owner=$2;number=$3;if(owner~/SYSADMIN/ && number!=12101)print $0}END{print FILENAME}' tab1 awk 'BEGIN{NUM1=7}{if($1&=NUM1) print $0}END{print FILENAME}' tab1 当在a w k中修改任何域时,重要的一点是要记住实际输入文件是不可修改的,修改的只是保存在缓存里的a w k复本awk 'BEGIN{NUM1=7}{if($1&=NUM1) print $1+2,$2,$3+100}END{print FILENAME}' tab1 只打印修改部分:用{}awk 'BEGIN{NUM1=7}{if($1&=NUM1){$2=&ORACLE&; print $0}}END{print &filename:&FILENAME}' tab1
可以创建新的域awk 'BEGIN{NUM1=7;print &COL1&tCOL2&tCOL3&tCOL4&}{if($1&=NUM1){$4=$1*$3;$2=&ORACLE&; print $0}}END{print &filename:&FILENAME}' tab1 打印总数:awk 'BEGIN{NUM1=7;print &COL1&tCOL2&tCOL3&tCOL4&}{if($1&=NUM1){tot+=$3;$4=$1*$3;$2=&ORACLE&; print $0}}END{print &filename:&FILENAME &total col3:& tot}' tab1 使用此模式打印文件名及其长度,然后将各长度相加放入变量t o t中。ls -l | awk '/^[^d]/ {print$9&&t&$5} {tot+=$5}END{print &total KB:& tot}' 内置字符串函数gsub 字符要用引号,数字不用awk 'gsub(/12101/,&hello&) {print $0} END{print FILENAME}' tab1awk 'gsub(/1) {print $0} END{print FILENAME}' tab1 indexawk '{print index($2,&D&)&&t&;print $0}' tab1awk '{print index($2,&D&)&&t& $0}' tab1 lengthawk '{print length($2)&&t& $0}' tab1 maawk '{print match($2,&M&)&&t& $0}' tab1 splitawk '{print split($2,new_array,&_&)&&t& $0}' tab1 sub 替换成功返回1,失败返回0awk '{print sub(/SYS/,&oracle&,$2)&&t& $0}' tab1 substrawk '{print substr($2,1,3)&&t& $0}' tab1 从s h e l l中向a w k传入字符串echo &Stand-by& | awk '{print length($0)&&t&$0}'8 & & & & & & & & & & & & & & & & Stand-by file1=&tab1&cat $file1 | awk '{print sub(/ADMIN/,&sss&,$2)&&t&$0}' 字符串屏蔽序列& b 退格键 & & && t t a b键& f 走纸换页 & && d d d 八进制值& n 新行 & & & & & c 任意其他特殊字符,例如& &为反斜线符号& r 回车键 awk printf修饰符- 左对齐Wi d t h 域的步长,用表示步长. p r e c 最大字符串长度,或小数点右边的位数 如果用格式修饰输出,要指明具体的域,程序不会自动去分辨awk '{printf &%-2d %-10s %d&n&, $1,$2,$3}' tab1输出结果9 SYSADMIN & 121019 SYSADMIN & 1210114 SYSADMIN & 0029 SYSADMIN & 121012 JLNQ & & & 121012 JLNQ & & & 121017 SYSADMIN & 121017 SYSADMIN & 121016 ac_ds_e_rr_mr 13333 向一行a w k命令传值awk 'BEGIN{SYS=&SYSADMIN&}{if($2==SYS) printf &%-2d %-10s %d&n&, $1,$2,$3}' tab1在动作后面传入awk '{if($2==SYS) printf &%-2d %-10s %d&n&, $1,$2,$3}' SYS=&SYSADMIN& tab1 awk脚本文件
SED用法sed怎样读取数据s e d从文件的一个文本行或从标准输入的几种格式中读取数据,将之拷贝到一个编辑缓冲区,然后读命令行或脚本的第一条命令,并使用这些命令查找模式或定位行号编辑它。重复此过程直到命令结束。 调用s e d有三种方式使用s e d命令行格式为:sed [选项] &s e d命令 & 输入文件。记住在命令行使用s e d命令时,实际命令要加单引号。s e d也允许加双引号。使用s e d脚本文件,格式为:sed [选项] -f & &sed脚本文件 & 输入文件要使用第一行具有s e d命令解释器的s e d脚本文件,其格式为:s e d脚本文件 [选项] & 输入文件使用s e d在文件中定位文本的方式x & & & & & & x为一行号,如1x , y & & & & 表示行号范围从x到y,如2,5表示从第2行到第5行/ p a t t e r n / 查询包含模式的行。例如/ d i s k /或/[a-z]// p a t t e r n / p a t t e r n / 查询包含两个模式的行。例如/ d i s k / d i s k s /p a t t e r n / , x 在给定行号上查询包含模式的行。如/ r i b b o n / , 3x , / p a t t e r n / 通过行号和模式查询匹配行。3 , / v d u /x , y ! 查询不包含指定行号x和y的行。1 , 2 ! sed编辑命令p &打印匹配行= &显示文件行号a& &在定位行号后附加新文本信息i& &在定位行号后插入新文本信息d &删除定位行c& &用新文本替换定位文本s 使用替换模式替换相应模式r 从另一个文件中读文本w 写文本到一个文件q 第一个模式匹配完成后推出或立即推出l 显示与八进制A S C I I代码等价的控制字符{ } 在定位行执行的命令组n 从另一个文件中读文本下一行,并附加在下一行g 将模式2粘贴到/pattern n/y 传送字符n 延续到下一输入行;允许跨行的模式匹配语句 sed编程举例打印单行 & & sed -n '2p' quo*打印范围 & &sed -n '1,3p' quote.txt打印有此模式的行 & &sed -n '/disco/'p quote.txt使用模式和行号进行查询
sed -n '4,/The/'p quote.txt &sed -n '1,/The/'p quote.txt 会打印所有记录?用.*代表任意字符 & sed -n '/.*ing/'p quote.txt打印行号 sed -e '/music/'= quote.txt 或sed -e '/music/=' quote.txt如果只打印行号及匹配行,必须使用两个s e d命令,并使用e选项。第一个命令打印模式匹配行,第二个使用=选项打印行号,格式为sed -n -e /pattern/p -e /pattern/=。sed -n -e '/music/p' -e '/music/'= quote.txt 先打印行号,再打印匹配行sed -n -e '/music/=' -e '/music/'p quote.txt 替换sed 's/The/Wow!/' quote.txt 保存到文件sed '1,2 w filedt' quote.txt 读取文件,在第一行后面读取sed '1 r sedex.txt' quote.txt 替换字符系列如果变量x含有下列字符串:x=&Department+payroll%Building G&要实现以下转换:+ to 'of' &% to located语句: echo $x | sed 's/&+/ of /g' | sed 's/&%/ located /g'
————————————————————————————shell命令执行的相应顺序&&令1 && 命令2 & & 如果这个命令1执行成功& &那么执行这个命2mv myfile myfile2 && echo &if you are seeing this then mv was success!& || 如果| |左边的命令(命令1)未执行成功,那么就执行| |右边的命令(命令2)mv myfile myfile2 && echo &if you are seeing this then mv was success! & 从一个审计文件中抽取第1个和第2个域,并将其输出到一个临时文件中,如果这一操作未成功,我希望能够收到一个相应邮件:awk '{print$1,$2}' test3 &test2 || echo &sorry the extraction didn't work & | mail root (命令1;命令2;. . .)如果使用{ }来代替(),那么相应的命令将在子s h e l l而不是当前s h e l l中作为一个整体被执行,只有在{ }中所有命令的输出作为一个整体被重定向时,其中的命令才被放到子s h e l l中执行,否则在当前s h e l l执行。例子:如果s o r t命令执行成功了,可以先将输出文件备份,然后再打印test.sorted && (cp test.sorted test.sorted_lp test.sorted) 经常使用的正则表达式举例^ & & & & & & & & & & & & & & & & 行首$ & & & & & & & & & & & & & & & & 行尾^ [ t h e ] & & & & & & & & & & &以t h e开头行[ S s ] i g n a [ l L ] & & & & & & &匹配单词s i g n a l、s i g n a L、S i g n a l、S i g n a L[Ss]igna[lL]&. & & & & & & & &同上,但加一句点[ m a y M A Y ] & & & & & & 包含m a y大写或小写字母的行^ U S E R $ & & & & & & & & &只包含U S E R的行[tty]$ & & & & & & & & & & & & & 以t t y结尾的行& . & & & & & & & & & & & & & & & &带句点的行^ d . . x . . x . . x & & & & &对用户、用户组及其他用户组成员有可执行权限的目录^ [ ^ l ] & & & & & & & & & & & &排除关联目录的目录列表^[^d] & & & & & & & &ls –l | grep ^[^d] 只显示非文件夹的文件 & & & & [ . * 0 ]
& & & & & & & & & & &0之前或之后加任意字符[ 0 0 0 * ]
& & & & & & & & 0 0 0或更多个[ iI] & & & & & & & & & & & & & & 大写或小写I[ i I ] [ n N ]
& & & & & & & 大写或小写i或n[ ^ $ ]
& & & & & & & & & & & &空行[ ^ . * $ ]
& & & & & & & & & &匹配行中任意字符串^ . . . . . . $
& & & & & & & & 包括6个字符的行[a- zA-Z]
& & & & & & & & & &任意单字符[ a - z ] [ a - z ] * & & & & 至少一个小写字母[ ^ 0 - 9 & $ ]
& & & & & & & 非数字或美元标识[ ^ 0 - 0 A - Z a - z ]
& &非数字或字母[ 1 2 3 ]
& & & & & & & & & & &1到3中一个数字[ D d ] e v i c e
& & & & & 单词d e v i c e或D e v i c eD e . . c e
& & & & & & & & & 前两个字母为D e,后跟两个任意字符,最后为c e& ^ q
& & & & & & & & & & & & & 以^ q开始行^ . $
& & & & & & & & & & & & & 仅有一个字符的行^&.[0-9][0-9]
& & & & & & & 以一个句点和两个数字开始的行' & D e v i c e & ' & & & & & &单词d e v i c eD e [ V v ] i c e & . & & & & & & & 单词D e v i c e或d e v i c e[ 0 - 9 ] & { 2 & } - [ 0 - 9 ] & { 2 & } - [ 0 - 9 ] & { 4 & }
& & 对日期格式d d - m m - y y y y[ 0 - 9 ] & { 3 & } & . [ 0 - 9 ] & { 3 & } & . [ 0 - 9 ] & { 3 & } & . [ 0 - 9 ] & { 3 & } I P地址格式[ ^ . * $ ]
& & & & & & & & & &匹配任意行[A-Za-z]* & & & & & &匹配所有单词
常用的g r e p选项-c 只输出匹配行的计数。-i 不区分大小写(只适用于单字符)。-h 查询多文件时不显示文件名。-l 查询多文件时只输出包含匹配字符的文件名。-n 显示匹配行及行号。-s 不显示不存在或无匹配文本的错误信息。-v 显示不包含匹配文本的所有行。例子grep -v &Sort& tab2 & & 显示不包含匹配文本的所有行grep -n &Sort& tab2 & & 显示匹配行及行号grep -c &Sort& tab2 & & 只输出匹配行的计数精确匹配: grep &01&&& tab2grep -in &code& tab2 & &忽略大小写多次过滤grep -in &code& tab2 | grep &02& 使用grep匹配“与”或者“或”模式g r e p命令加- E参数,这一扩展允许使用扩展模式匹配。例如,要抽取城市代码为2 1 9或2 1 6,方法如下:grep –E ‘219|216’ tab2g r e p允许使用国际字符模式匹配或匹配模式的类名形式。类 & & & & & & & & & & & &等价的正则表达式[ [ : u p p e r : ] ] & & & [ A - Z ][ [ : a l n u m : ] ] & & & & &[ 0 - 9 a - zA-Z][ [ : l o w e r : ] ] & & & &[ a - z ][ [ : s p a c e : ] ] & & & & 空格或t a b键[ [ : d i g i t : ] ] & & & & [ 0 - 9 ][ [ : a l p h a : ] ] & & & [ a - z A - Z ] 大多数系统管理员称 / d e v / n u l l为比特池, 可以将之看成一个无底洞,有进没有出,永远也不会填满。 要查看D N S是否正在运行(通常称为n a m e d),方法如下ps -ef | grep &name&|grep -v &grep& e g r e pe g r e p接受所有的正则表达式,一个显著特性是可以以一个文件作为保存的字符串,然后将之传给e g r e p作为参数,为此使用- f开关。 & egrep -f par2 tab2 & &par2是文件,里面包括各种匹配的具体格式 如果要查询存储代码3 2 L或2 C C,可以使用(|)符号,意即“|”符号两边之一或全部。egrep '(Code|Sort)' tab2
awk 内置函数详细介绍awk内置函数,主要分以下3种类似:算数函数、字符串函数、其它一般函数、时间函数 一、算术函数:以下算术函数执行与 C 语言中名称相同的子例程相同的操作:函数名说明atan2( y, x )返回 y/x 的反正切。cos( x )返回 x 的余弦;x 是弧度。sin( x )返回 x 的正弦;x 是弧度。exp( x )返回 x 幂函数。log( x )返回 x 的自然对数。sqrt( x )返回 x 平方根。int( x )返回 x 的截断至整数的值。rand( )返回任意数字 n,其中 0 &= n & 1。srand( [Expr] )将 rand 函数的种子值设置为 Expr 参数的值,或如果省略 Expr 参数则使用某天的时间。返回先前的种子值。 举例说明:[chengmo@centos5 ~]$ awk 'BEGIN{OFMT=&%.3f&;fs=sin(1);fe=exp(10);fl=log(10);fi=int(3.1415);print fs,fe,fl,}'0.841 .303 3 OFMT 设置输出数据格式是保留3位小数获得随机数:[chengmo@centos5 ~]$ awk 'BEGIN{srand();fr=int(100*rand());}'78[chengmo@centos5 ~]$ awk 'BEGIN{srand();fr=int(100*rand());}'31[chengmo@centos5 ~]$ awk 'BEGIN{srand();fr=int(100*rand());}'41
二、字符串函数是:函数说明gsub( Ere, Repl, [ In ] )除了正则表达式所有具体值被替代这点,它和 sub 函数完全一样地执行,。sub( Ere, Repl, [ In ] )用 Repl 参数指定的字符串替换 In 参数指定的字符串中的由 Ere 参数指定的扩展正则表达式的第一个具体值。sub 函数返回替换的数量。出现在 Repl 参数指定的字符串中的 &(和符号)由 In 参数指定的与 Ere 参数的指定的扩展正则表达式匹配的字符串替换。如果未指定 In 参数,缺省值是整个记录($0 记录变量)。index( String1, String2 )在由 String1 参数指定的字符串(其中有出现 String2 指定的参数)中,返回位置,从 1 开始编号。如果 String2 参数不在 String1 参数中出现,则返回 0(零)。length [(String)]返回 String 参数指定的字符串的长度(字符形式)。如果未给出 String 参数,则返回整个记录的长度($0 记录变量)。blength [(String)]返回 String 参数指定的字符串的长度(以字节为单位)。如果未给出 String 参数,则返回整个记录的长度($0 记录变量)。substr( String, M, [ N ] )返回具有 N 参数指定的字符数量子串。子串从 String 参数指定的字符串取得,其字符以 M 参数指定的位置开始。M 参数指定为将 String 参数中的第一个字符作为编号 1。如果未指定 N 参数,则子串的长度将是 M 参数指定的位置到 String 参数的末尾 的长度。match( String, Ere )在 String 参数指定的字符串(Ere 参数指定的扩展正则表达式出现在其中)中返回位置(字符形式),从 1 开始编号,或如果 Ere 参数不出现,则返回 0(零)。RSTART 特殊变量设置为返回值。RLENGTH 特殊变量设置为匹配的字符串的长度,或如果未找到任何匹配,则设置为 -1(负一)。split( String, A, [Ere] )将 String 参数指定的参数分割为数组元素 A[1], A[2], . . ., A[n],并返回 n 变量的值。此分隔可以通过 Ere 参数指定的扩展正则表达式进行,或用当前字段分隔符(FS 特殊变量)来进行(如果没有给出 Ere 参数)。除非上下文指明特定的元素还应具有一个数字值,否则 A 数组中的元素用字符串值来创建。tolower( String )返回 String 参数指定的字符串,字符串中每个大写字符将更改为小写。大写和小写的映射由当前语言环境的 LC_CTYPE 范畴定义。toupper( String )返回 String 参数指定的字符串,字符串中每个小写字符将更改为大写。大写和小写的映射由当前语言环境的 LC_CTYPE 范畴定义。sprintf(Format, Expr, Expr, . . . )根据 Format 参数指定的
子例程格式字符串来格式化 Expr 参数指定的表达式并返回最后生成的字符串。Ere都可以是正则表达式 gsub,sub使用[chengmo@centos5 ~]$ awk 'BEGIN{info=&this is a test2010test!&;gsub(/[0-9]+/,&!&,info);print info}' & this is a test!test! 在 info中查找满足正则表达式,/[0-9]+/ 用””替换,并且替换后的值,赋值给info 未给info值,默认是$0 查找字符串(index使用)[wangsl@centos5 ~]$ awk 'BEGIN{info=&this is a test2010test!&;print index(info,&test&)?&ok&:&no found&;}' & &ok未找到,返回0 正则表达式匹配查找(match使用)[wangsl@centos5 ~]$ awk 'BEGIN{info=&this is a test2010test!&;print match(info,/[0-9]+/)?&ok&:&no found&;}' & & & & & ok 截取字符串(substr使用)[wangsl@centos5 ~]$ awk 'BEGIN{info=&this is a test2010test!&;print substr(info,4,10);}' & & & & & & & & & & & & s is a tes从第 4个 字符开始,截取10个长度字符串 字符串分割(split使用)[chengmo@centos5 ~]$ awk 'BEGIN{info=&this is a test&;split(info,tA,& &);print length(tA);for(k in tA){print k,tA[k];}}'44 test1 this2 is3 a 分割info,动态创建数组tA,这里比较有意思,awk for …in 循环,是一个无序的循环。 并不是从数组下标1…n ,因此使用时候需要注意。 格式化字符串输出(sprintf使用)格式化字符串格式:其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出; 另一部分是格式化规定字符, 以&%&开始, 后跟一个或几个规定字符,用来确定输出内容格式。 格式符说明%d十进制有符号整数%u十进制无符号整数%f浮点数%s字符串%c单个字符%p指针的值%e指数形式的浮点数%x%X 无符号以十六进制表示的整数%o无符号以八进制表示的整数%g自动选择合适的表示法[chengmo@centos5 ~]$ awk 'BEGIN{n1=124.113;n2=-1.224;n3=1.2345; printf(&%.2f,%.2u,%.2g,%X,%o\n&,n1,n2,n3,n1,n1);}'124.11,.2,7C,174 三、一般函数是:函数说明close( Expression )用同一个带字符串值的 Expression 参数来关闭由 print 或 printf 语句打开的或调用 getline 函数打开的文件或管道。如果文件或管道成功关闭,则返回 0;其它情况下返回非零值。如果打算写一个文件,并稍后在同一个程序中读取文件,则 close 语句是必需的。system(Command )执行 Command 参数指定的命令,并返回退出状态。等同于 子例程。Expression | getline [ Variable ]从来自 Expression 参数指定的命令的输出中通过管道传送的流中读取一个输入记录,并将该记录的值指定给 Variable 参数指定的变量。如果当前未打开将 Expression 参数的值作为其命令名称的流,则创建流。创建的流等同于调用
子例程,此时 Command 参数取 Expression 参数的值且 Mode 参数设置为一个是 r 的值。只要流保留打开且 Expression 参数求得同一个字符串,则对 getline 函数的每次后续调用读取另一个记录。如果未指定 Variable 参数,则 $0 记录变量和 NF 特殊变量设置为从流读取的记录。getline [ Variable ] & Expression从 Expression 参数指定的文件读取输入的下一个记录,并将 Variable 参数指定的变量设置为该记录的值。只要流保留打开且 Expression 参数对同一个字符串求值,则对 getline 函数的每次后续调用读取另一个记录。如果未指定 Variable 参数,则 $0 记录变量和 NF 特殊变量设置为从流读取的记录。getline [ Variable ]将 Variable 参数指定的变量设置为从当前输入文件读取的下一个输入记录。如果未指定 Variable 参数,则 $0 记录变量设置为该记录的值,还将设置 NF、NR 和 FNR 特殊变量。 打开外部文件(close用法)[chengmo@centos5 ~]$ awk 'BEGIN{while(&cat /etc/passwd&|getline){print $0;};close(&/etc/passwd&);}'root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologin 逐行读取外部文件(getline使用方法)[chengmo@centos5 ~]$ awk 'BEGIN{while(getline & &/etc/passwd&){print $0;};close(&/etc/passwd&);}'root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologin [chengmo@centos5 ~]$ awk 'BEGIN{print &Enter your name:&;}'Enter your name:chengmochengmo
调用外部应用程序(system使用方法)[chengmo@centos5 ~]$ awk 'BEGIN{b=system(&ls -al&);}'total 42092drwxr-xr-x 14 chengmo chengmo & &
17:47 .drwxr-xr-x 95 root & root & & &
14:01 .. b返回值,是执行结果。
四、时间函数 函数名说明mktime( YYYY MM DD HH MM SS[ DST])生成时间格式strftime([format [, timestamp]])格式化时间输出,将时间戳转为时间字符串 具体格式,见下表.systime()得到时间戳,返回从日开始到当前时间(不计闰年)的整秒数 创建指定时间(mktime使用)[chengmo@centos5 ~]$ awk 'BEGIN{tstamp=mktime(& 12 12 12&);print strftime(&%c&,tstamp);}'日 星期一 12时12分12秒 [chengmo@centos5 ~]$ awk 'BEGIN{tstamp1=mktime(& 12 12 12&);tstamp2=mktime(& 0 0 0&);print tstamp2-tstamp1;}'2634468求2个时间段中间时间差,介绍了strftime使用方法 [chengmo@centos5 ~]$ awk 'BEGIN{tstamp1=mktime(& 12 12 12&);tstamp2=systime();print tstamp2-tstamp1;}'
strftime日期和时间格式说明符格式描述%a星期几的缩写(Sun)%A星期几的完整写法(Sunday)%b月名的缩写(Oct)%B月名的完整写法(October)%c本地日期和时间%d十进制日期%D日期 08/20/99%e日期,如果只有一位会补上一个空格%H用十进制表示24小时格式的小时%I用十进制表示12小时格式的小时%j从1月1日起一年中的第几天%m十进制表示的月份%M十进制表示的分钟%p12小时表示法(AM/PM)%S十进制表示的秒%U十进制表示的一年中的第几个星期(星期天作为一个星期的开始)%w十进制表示的星期几(星期天是0)%W十进制表示的一年中的第几个星期(星期一作为一个星期的开始)%x重新设置本地日期(08/20/99)%X重新设置本地时间(12:00:00)%y两位数字表示的年(99)%Y当前月份%Z时区(PDT)%%百分号(%)
以上是awk常见 内置函数使用及说明,希望对大家有所帮助。 正则的基本语法一、基本语法正则的基本语法就大概是下面这些,但是正则远不止这些,甚至可以写一本书,当然了,我们这里只列举一些简单的用法,这些已经可以解决大部分实际问题了。1、字符类字符含义举例.匹配任意一个字符abc. 可 以匹配abcd 、abc9 等[]匹配括号中的任意一个字符[abc]d 可以匹配ad 、bd 或cd-用在[]中,表示字符范围[0-9a-fA-F] 可以匹配一位十六进制数字^如果位于[]的开头,则匹配除去括号中字符之外的一切字符[^xy] 匹配除xy 之外的任一字符,因此[^xy]1 可以 匹配a1、b1 但不匹配x1 、y1[[:xxx:]]grep 工 具预定义的一些命名字符类[[:alpha:]] 匹配一个字母,[[:digit:]] 匹配一个数字2、数量限定符字符含义举例?紧跟在它前面的单元匹配零次或一次[0-9]?/.[0-9] 匹配0.0 、2.3 、.5 等,由于. 在正则表达式中是一个特殊字符,所以需要用/ 转 义一下,取字面值+紧跟在它前面的单元匹配一次或多次[a-zA-Z0-9.-_]+@[a-zA-Z0-9.-_]+/.[a-zA-Z0-9.-_]匹配email*紧跟在它前面的单元匹配零次或多次[0-9][0-9]* 匹配至少一位数字,等价于[0-9]+ ,[a-zA-Z_]+[a-zA-Z_0-9]* 匹 配C语言的标识符{N}紧跟在它前 面的单元应精确匹配N次[1-9][0-9]{2} 匹 配从100 到999 的整数{N,}紧跟在它前面的单元至少要匹配n次[1-9][0-9]{2,} 匹配三位以上(含三位)的整数{,M}紧跟在它前面的单元至多匹配m次[0-9]{,1}和[0-9]?意义一样,{N,M}紧跟在它前面的单元至少匹配n次,至多匹配m次[0-9]{1,3}/.[0-9]{1,3}/.[0-9]{1,3}/.[0-9]{1,3}/.用于匹配ip地址3、位置限定符字符含义举例^匹配行首的位置^content匹配以content开头的行$匹配行末的位置:$匹配以:结尾的行,^$匹配空行/&匹配单词开头的位 置/&th 匹配... this ,但不匹配ethernet 、tenth/&匹 配单词结尾的位置p/& 匹配leap ... ,但不匹配parent 、sleepy/b匹 配单词开头或结尾的位置ap/b匹配leap,/ble匹配leap,/bat/b 匹配... at ... ,但不匹配cat、atexit 、batch/B匹配非单词开头和结尾的位置/Bat/B 匹配battery ,但不匹配... attend 、hat ... 4、其他特殊字符字符含义举例/转义字符,普通字符转义为特殊字符,特殊字符转义为普通字符普 通字符& 写成/& 表 示单词开头的位置,特殊字符. 写成/.以 及/ 写成// 就当作普通字符来 匹配()将正则表达式的一部分括起 来组成一个单元,可以对整个单元使用数量限定符([0-9]{1,3}/.){3}[0-9]{1,3} 匹 配IP地址|连接两个表达式,表示或的关系n[o-either]可以匹配no或neither
[root@ ~]# sed [-nefr] [动作] &参数∶ &-n &∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN &
& & &的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过 & & & &sed 特殊处理的那一行(或者动作)才会被列出来。 &-e &∶直接在指令列模式上进行 sed 的动作编辑; &-f &∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的 &
& & &sed 动作; &-r &∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法) &-i &∶直接修改读取的档案内容,而不是由萤幕输出。 & &动作说明∶ &[n1[,n2]]function &n1, n2 ∶不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作 & & & & & 是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』 & &function 有底下这些咚咚∶ &a & ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~ &c & ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行! &d & ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚; &i & ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行); &p & ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~ &s & ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配 & & & &正规表示法!例如 1,20s/old/new/g 就是啦! &范例∶ & &范例一∶将 /etc/passwd 的内容列出,并且我需要列印行号,同时,请将第 2~5 行删除! &[root@linux ~]# nl /etc/passwd | sed '2,5d' & & & 1 &root:x:0:0:root:/root:/bin/bash & & & 6 &sync:x:5:0:sync:/sbin:/bin/sync & & & 7 &shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown &.....(后面省略)..... &# 看到了吧?因为 2-5 行给他删除了,所以显示的资料中,就没有 2-5 行棉~ &# 另外,注意一下,原本应该是要下达 sed -e 才对,没有 -e 也行啦! &# 同时也要注意的是, sed 后面接的动作,请务必以 '' 两个单引号括住喔! &# 而,如果只要删除第 2 行,可以使用 nl /etc/passwd | sed '2d' 来达成, &# 至于第 3 到最后一行,则是 nl /etc/passwd | sed '3,$d' 的啦! &
&范例二∶承上题,在第二行后(亦即是加在第三行)加上『drink tea?』字样! &[root@linux ~]# nl /etc/passwd | sed '2a drink tea'& bash shell - sed, awk文本捕获及替换bash shell虽然支持正则表达式, 但是正则操作却不大给力. 看以下示例 case需求. stream='background-image: url (a.jpg)background:url(b.jpg);background' 需要将背景图片内容a.jpg及b.jpg后追加一个签名串. sed替换不给力 如果用sed, 替换是不会有问题, 但是要在一句代码里进行捕获多个图, 将进行替换, 查阅了相关的sed文档, 貌似是需求处理不了. 代码示例stream='background-image: url (a.jpg)background:url(b.jpg);background' echo $stream | sed 's#.*url *( *\(.*\) *).*#\1#' #输出b.jpgawk代码块 用awk的话,(g)sub又没有sed里的匹配后的&后向引用&(即&\1&). 但是可以有代码块可操作. 原理可利用awk里的函数match先用正则匹配url()里的内容, 再用substr将内容取出, 随之将流的位置置后. 循环操作. 代码如下:stream='background-image: url (a.jpg)background:url(b.jpg);background' matches=$(echo $stream | awk 'BEGIN {ORS=& &} END {
gsub(/ */,&&, $0)
while (match(input, &url([^?;)]+)&)) {
print substr(input, RSTART+4, RLENGTH-4)
input=substr(input, RSTART+RLENGTH)
} }') for bg_file in `echo &${matches}&`; do
md5_code=&test&
stream=$(echo &${stream}& | sed &s#url *( *${bg_file} *)#url(${bg_file}?v=${md5_code})#&) done echo &${stream}&总结 从以上的示例可以看出, awk几乎可以替代sed, 但是对于固定替换, sed使用起来更方便. sed从使用理解上看, 与vi的命令操作很相似. 而在awk里块里几乎可以操作任意文本流. 另外要说明的是, 这两个命令所支持的正则都像是标准perl里的子集, 没有贪婪匹配与非贪婪匹配之分.
Linux shell编程之awk的用法    1. awk的使用   基本功能:在文件或字符串中基于指定规则浏览和抽取信息。awk抽取信息後,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件信息。    调用方式:  1. 命令行方式   2. 将所有awk命令插入一个文件,并使awk程序可执行,然后使awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用它。   3. 将所有的awk命令插入一个单独文件,然后调用。   选项说明:-F 域符号 缺省为空格   -f 指明awk脚本    2. 模式和动作   1. 任何awk语句都由模式和动作组成。在一个awk脚本中可能有许多语句。   模式部分决定动作语句何时触发及触发事件。模式缺省为执行状态。   处理即对数据进行的操作。   2. 模式可以是任何条件语句或复合语句或正则表达式。   3. 模式包括两个特殊字段BEGIN和END。    域和记录   域标识:$1,$2,…,$n。用逗号做域分隔。$0表示所有域。   打印域或所有域:print命令   注:当碰到awk错误时,可相应查找:   1. 确保整个awk命令用单引号括起来   2. 确保命令内所有引号成对出项   3. 确保用花括号括起动作语句,用圆括号括起条件语句   4. 不要忘记使用花括号    条件操作符   ~ 匹配正则表达式   !~ 不匹配正则表达式    内置变量:   NF:每一条记录中域名数   是将变量$PWD的返回值传入awk并显示其目录。   可以利用NF获取文件名   注:但这里指定域分隔符为/   NR:记录个数    Linux shell编程之sed用法   1. 是一个非交互性文本流编辑器。它编辑文件或标准输入导出的文本拷贝。   2. 通过行号或正则表达式指定要改变的文本行   3. sed不与初始文件打交道,而只与它的一个拷贝打交道,如果操作结果没有重定向到一个文件,那么将输出到屏幕。    调用方式:   a. 命令行方式   b. 将sed命令插入脚本文件中,然后调用sed   c. 将sed命令插入脚本文件中,使得脚本文件为可执行。    保存sed输出   重定向到一个新文件 &   sed中定位文本的方式   x 一行号   x,y 行号范围   /pattern/ 查询包含模式的行   /pattern/pattern/ 查询包含两个模式的行   /pattern/,x 在指定行号上查询匹配模式的行   x,/pattern/ 通过行号和模式查询匹配行   x,y! 查询不包含行号x,y的行    sed编辑命令   p 打印文本   匹配元字符$前,必须使用反斜线\   = 打印行号 使用-e选项   如果既打印行号又打印匹配行,必须使用两个sed命令,并使用-e选项    附加文本   使用符号a\ ,可以指定文本一行或多行附加到指定行。若不指定文本放置位置位置,sed缺省放置在每一行后面。    创建sed脚本文件   创建脚本文件,第一行为:   #!/bin/sed -f ----注 说明sed命令解释行。脚本在这一行查找sed以运行命令,这里定位在/bin    插入文本:在指定行前面插入,它也只接受一个地址。    删除文本:d   替换命令用替换模式替换指定模式    使用sed实现的一个重要功能是在另一个系统中下载的文件中剔除控制字符。  1. 使用s/-*//g删除横线-----   2. 使用/^$s/d删除空行   3. 使用$d删除最后一行   4. 使用1d删除第一行   5. 使用awk{print $1}打印第一列
虽然人们看不到Linux在桌面市场方面的光明前景,但Linux在服务器方面的份额确实远
What is NFS NFS是Network FileSystem的缩写,即网络文件系统,它可以实现挂载远程电脑上
mc(midnight commander) 功能说明: 提供一个菜单式的文件管理程序。 语 法: mc [-abcdfhkPst

我要回帖

更多关于 js quot 的文章

 

随机推荐