快捷搜索:

您的位置:澳门新葡4473网站 > 新葡亰平台娱乐 > 一天一个shell命令 linux文本内容操作系列-awk命令

一天一个shell命令 linux文本内容操作系列-awk命令

发布时间:2020-01-09 17:57编辑:新葡亰平台娱乐浏览(200)

    那位 SUSE 开采者 Martin Liška 近来正值寻求关于那项提出的只怕性,他表示,那不是将现存的 GCC C 编写翻译器代码替换为脚本语言或近乎的别的事物,而是意在替换当前难以维护的 AWK 脚本。

    简介

    Martin Liška 感到,GCC 中的 AWK 代码今后“对开展此外调解都相当不乐意”,由此 Martin在考查是或不是有丰裕多的中游开拓者更愿意看到允许 Python 替代它。而该项议案恐怕由 GCC 指委会负责。

    awk是三个强硬的文件剖判工具,相对于grep的搜寻,sed的编写,awk在其对数码拆解解析并转移报告时,显得愈发强盛。由此可以见到awk正是把公文逐行的读入,以空格为暗许分隔符将每行切块,切开的有些再开展各类解析处理。
    awk有3个不一样版本: awk、nawk和gawk,未作特地表达,平时指gawk,gawk 是 AWK 的 GNU 版本。
    awk其名称得自于它的奠基者 Ayr弗瑞德 Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的第四个假名。实际上 AWK 的确具备和睦的语言: AWK 程序设计语言 , 三位创小编已将它正式定义为“样式扫描和拍卖语言”。它同意你创制简短的次第,那一个程序读取输入文件、为数据排序、管理数量、对输入执行总括以至改换报表,还会有不菲别样的功效。

    Martin 提到的有关 AWK 的局部主题材料

    行使形式

    • gcc/optc-save-gen.awk 充满了复制粘贴的代码,而出于缺乏标识类型类(flags type classes卡塔尔(قطر‎,招致创立了多少个全局变量(var_opt_char, var_opt_string, ...)

    • 周围的政工业生发生在 gcc/opth-gen.awk

    • 咱俩做了众多正则表明式相配职业(主要在 gcc/opt-functions.awk 中),但应当提议生机勃勃种结构化的选项格式,使深入分析和拍卖尤其简约

    • ……

    awk '{pattern + action}' {filenames}

    时下未曾意识其余中游开拓者对该议案摘登商议,但该议事原案能够在 GCC 邮件列表中找到。

    即便操作可能会很复杂,但语法总是这么,此中 pattern 表示 AWK 在数额中寻找的原委,而 action 是在找到相配内容时所奉行的风流倜傥体系命令。花括号({})无需在程序中始终现身,但它们用于依照特定的格局对大器晚成多级指令进行分组。 pattern就是要代表的正则表明式,用斜杠括起来。

    (文/开源中华夏族民共和国State of Qatar    

    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语句块
       他们任何意气风发有的都得以不出现在剧本中。脚本日常包蕴在双引号恐怕单引号内。
       例如:

    awk 'BEGIN{i=0}{i++}END{print i}' filename 

    专业规律

    awk命令的劳作措施如下:

    1. 进行BEGIN{commands}语句块中的语句
    2. 从文件只怕stdin中读取风流倜傥行,然后施行pattern{commands}. 迭代直到全体读取完毕
    3. 末尾实行END{commands}语句块

    重复提醒,他们任何大器晚成部都得以未有

    而awk的机能也远不独有如此

    入门实例:

    复制代码 代码如下:

    echo | awk '{var1="v1";var2="v2";var3="v3"; print var1,var2,var3;}' 
    打印: v1 v2 v3 

    解释:逗号为定界符(分隔符)

    echo | awk '{var1="v1";var2="v2";var3="v3"; print var1"-"var2"-"var3;}'

    打印v1-v2-v3

    表达:双引号为连接符

    别的任何标志,都无法平日输出v1,v2,v3

    解读--help(叁个不行宏大复杂的支援文书档案,官方用了410页的篇幅PDF来介绍,倘诺自个儿片言只字,你信作者自身都不相信。。)

    用法: awk [POSIX 或 GNU 风格选项] -f 脚本文件 [--] 文件 ...
    用法: awk [POSIX 或 GNU 风格选项] [--] '程序' 文件 ...
    POSIX 选项:             GNU 长选项:
         -f 脚本文件        --file=脚本文件
        -F fs            --field-separator=fs
    点名输入文本分隔符,fs是八个字符串恐怕是三个正则表达式,
        -v var=val        --assign=var=val
    将表面变量值付给var
         -m[fr] val
         -O            --optimize
    启用一些优化程序的里边表示。
         -W compat        --compat
    在非常方式下运作awk。所以gawk的一坐一起和专门的学业的awk完全大器晚成致,全体的awk扩充都被忽视。
         -W copyleft        --copyleft
    打字与印刷简短的版权新闻
        -W copyright        --copyright
    打字与印刷短版的通用公共许可证,然后退出
         -W dump-variables[=file]    --dump-variables[=file]
    打字与印刷全局变量,其品种,提交的最后值的排系列表。
        -W exec=file        --exec=file
    与-f肖似,但与她有两点差异,(作者回头把有关文书档案上传,太长)
        -W gen-po        --gen-po
    (内容太多)
        -W help            --help 打印扶植
        -W lint[=fatal]        --lint[=fatal]
    告诫狐疑或不移植到任何的awk完结的构造
         -W lint-old        --lint-old
    打字与印刷关于不可能向古板unix平台移植的组织的告诫
         -W non-decimal-data    --non-decimal-data
    启用自动输入数据的疏解,八进制和十七进制值
         -W profile[=file]    --profile[=file]
    启用awk程序解析
         -W posix        --posix
    在严苛意义上的POSIX情势运营。
         -W re-interval        --re-interval
    允许距离一览表达式在正则表明式上
        -W source=program-text    --source=program-text
         -W traditional        --traditional
    守旧的Unix awk的正则表达式相称
         -W usage        --usage
         -W use-lc-numeric    --use-lc-numeric
    剖判数字输入时,免强行使的言语情形中的小数点字符
     数据
     -W version        --version
    交由错误报告请参考“gawk.info”中的“Bugs”页,它坐落于打字与印刷版本中的“Reporting
     Problems and Bugs”一节

    瞩目:gawk是awk的GNU版本,就算help ,在ubuntu下也亟需先安装gawk

    那回我们就胸无点墨读了,为了增添我们的音信和童趣,先来点基本的:

    有的奇怪变量:

    NLacrosse: 表示记录数据,在实行进程中对应于行号
    NF:表示字段数量,在实施进度中对应于当前进的字段数
    $0: 这些变量包罗实行进度中当前进的公文内容
    $1: 第叁个字段的文本内容
    $2: 第一个字段的文件内容

    例子:

    例1.

    复制代码 代码如下:

    echo -e "line1 f2 f3nline2 f4 f5nline3 f6 f7"|#这个是在窗口中写多行命令用的 
    awk '{ 
    print "Line no:"NR",No of fields:"NF, "$0="$0,"$1="$1,"$2="$2,"$3="$3 
    }' 

    小注一下:$1是打字与印刷第多个,$NF打字与印刷最终叁个字段,$(NF-1卡塔尔国打印倒数首个

     例2.

    seq 5 | awk 'BEGIN{ sum=0;print "Summation:"}{print $1"+";sum+=1}END{print "==";print sum}'

    那一个事例用到了宗旨格式。

    BEGIN中 开始化了sum,打印Summation
    高级中学档模块打印了第一列,然后给sum+1

    END中打字与印刷了sum

     例3. 有关-v 外界变量

    复制代码 代码如下:

    $ VAR=10000
    $echo | awk –v VARIABLE=$VAR'{print VARABLE}'

    还应该有另黄金年代种灵活的法门能够将七个外表变量传递给awk,比如:

    复制代码 代码如下:

    $var1="value1" var2="value2"
    $echo | awk '{print v1,v2}' v1=$var1 v2=$var2

    万一来自文件

    awk '{print v1,v2}' v1=$var1 v2=$var2 filename

    例4

    $awk 'NR < 5' #行号小于5
    $awk 'NR==1,NR==4' #行号在1到5之内的行
    $awk '/linux/' #含有样式linux的行(能够用正则表达式钦点样式)
    $awk '!/linux/' #不带有样式linux的行

    此番先写那么些,争取在花2个篇幅能把awk做个比较完备的认知。

    awk补充

    事前大家上学了awk基本入门,笔者欣喜的发掘有awk后生可畏篇详细随笔,有写念头,无法风姿罗曼蒂克体转载,转化成自身的不二等秘书技来写一些。

    教师内置变量和局地字符串函数

    内置变量(有翻译特殊变量和情况变量,依据法定翻译为停放变量)

    变量

    说明

    $n 当前记录的第n个字段,字段间由FS分隔。
    $0 完整的输入记录。
    ARGC 命令行参数的数目。
    ARGIND 命令行中当前文件的位置(从0开始算)。
    ARGV 包含命令行参数的数组。
    BINMODE 在非POSIX系统上,这个变量指定的所有I / O使用二进制模式
    CONVFMT 数字转换格式(默认值为%.6g)
    ENVIRON 环境变量关联数组。
    ERRNO 最后一个系统错误的描述。
    FIELDWIDTHS 字段宽度列表(用空格键分隔)。
    FILENAME 当前文件名。
    FNR 同NR,但相对于当前文件
    FPAT

    这是一个正则表达式(字符串),告诉gawk基于匹配正则表达式的文本来创建字段

    FS 字段分隔符(默认是任何空格)。
    IGNORECASE 如果为真,则进行忽略大小写的匹配。
    LINT

    当这个变量为真(非零或非空),gawk的行为犹如"--lint"命令行选项

    NF 当前记录中的字段数。
    NR 当前记录数。
    OFMT 数字的输出格式(默认值是%.6g)。
    OFS 输出字段分隔符(默认值是一个空格)。
    ORS 输出记录分隔符(默认值是一个换行符)。
    PROCINFO

    这个数组的元素提供访问运行awk程序的信息

    RLENGTH 由match函数所匹配的字符串的长度。
    RS 记录分隔符(默认是一个换行符)。
    RT 每次一条记录被读取的设置
    RSTART 由match函数所匹配的字符串的第一个位置。

    SUBSEP

    数组下标分隔符(默认值是34)。

    TEXTDOMAIN 此变量用于程序的国际化

    杏红为新添的放到变量。

     

    简轻便单比如:

    1. 01.sed 1q /etc/passwd | awk '{ FS = ":"; print $1 }'

    打字与印刷密码第大器晚成行,用冒号分隔符

    复制代码 代码如下:

    awk 'END{print FILENAME}' awk.txt

    打字与印刷文本FILENAME

    1. seq 100 | awk 'NR==4,NR==6'

    打印4到6行

     再介绍多少个awk内置的字符串函数,也讲一些。

    length(string):
     重返字符串的长短

    index(string,serch_string):
    返回search_string在字符串中冒出的岗位

    split(string,array,delimiter):
    用定界符生成五个字符串列表,并将该列表存入数组

    substr(string,array,delimiter):
     在字符串中用字符起止平价量生成子串,并回到该子串

    sub(regex,replacement_str,string):
    将正则表明式相称到的率先处内容替换到replacement_str

    gsub(regex,replacement_str,string):
    和sub(卡塔尔(قطر‎相通。可是该函数会交替正则表明式相称到的全体内容

    match(regex,string):
    检查正则表达式是不是能够匹配字符串。若是能够宽容,重返非0值;否则,再次回到0.match(卡塔尔国有四个相关的优良变量,分别是奥迪Q3START喝奥德赛LENGTH。变量LacrosseSTART富含正则表明式所般配内容的骨子里地点,而变量库罗德LENGTH富含正则表明式所相配内容的长短。  

    举例:

    1.$ awk '{ sub(/test/, "mytest"); print }' testfile

    在全体记录中极其,替换只产生在率先次相配爆发的时候

    2.$ awk '{ sub(/test/, "mytest"); $1}; print }' testfile

    在任何记录的率先个域中开展相配,替换只爆发在第叁遍相配发生的时候

    3.$ awk '{ print index("test", "mytest") }' testfile

    实例重返test在mytest的职责,结果应该是3

    4.$ awk '{ print length( "test" ) }'

    实例再次回到test字符串的长短。

    awk补充二

    那节恐怕要写的很粗了,时间太少。

    豆蔻年华. 放到函数
    瞩目风流倜傥种约定俗称语法习贯: [a]代表a可选.

    数字函数(Numeric Functions)

    函数名

    说明

    atan2(y,x) 返回y/x弧的反正切
    cos(x) 返回x的余弦
    exp(x) 返回x的指数
    int(x) 返回最靠近的整数,风向标指向0
    log(x) 返回x的自然对数
    rand() 返回随机数
    sin(x) 返回x的正弦
    sqrt(x) 返回x的正平方根
    srand([x]) 生成随机数,可以设置起点

    字符串操作函数(String-Manipulation Functions)
    留心:品绿部分为gawk特有,awk未有此函数功用。

    函数名

    说明

    asort(source [, dest [, how ] ]) 返回数组元素数(内容较多)
    asorti(source [, dest [, how ] ]) 同asort,(有细微差别)
    gensub(regexp, replacement, how [, target]) 搜索正则表达式RegExp匹配的regexp
    gsub(regexp, replacement [, target]) 将正则表达式匹配的第一处内容替换成replacement_str
    index(in, find) 返回find在字符串in中出现的位置
    length([string]) string 中的字符数
    match(string, regexp [, array]) 检查正则表达式能否匹配字符串
    patsplit(string, array [, fieldpat [, seps ] ])

    划分件到由fieldpat定义的字符串,并存储在array里,分隔字符串存在在seps数组

    split(string, array [, fieldsep [, seps ] ]) 用定界符生成一个字符串列表,并将该列表存入数组
    sprintf(format, expression1, ...) 打印
    strtonum(str) 字符转转换成数字
    sub(regexp, replacement [, target]) 将正则表达式匹配到的第一处内容替换成replacement
    substr(string, start [, length]) 分割字符串,根据其实位置和长度
    tolower(string) 转换成小写
    toupper(string) 转换成大写

    输入输出函数(Input/Output Functions)

    函数

    说明

    close(filename [, how]) 关闭文件输入输出流
    fflush([filename]) 刷新与文件名相关的任何缓冲输出
    system(command) 执行操作系统命令,返回值给awk程序

     光阴函数(Time Functions)

    函数

    说明

    mktime(datespec) datespec为时间戳格式,与systime()格式一样
    strftime([format [, timestamp [, utc-flag]]]) 格式化timestamp的内容,返回日期格式
    systime() 返回系统时间,精确到秒

     位操作函数(Bit-Manipulation Functions)

    函数

    说明

    and(v1, v2) v1,v2的与操作结果
    compl(val) val的反码
    lshift(val, count) 返回val左移count位的值
    or(v1, v2) v1,v2的或操作
    rshift(val, count) 返回val右移count位的值
    xor(v1, v2) 返回v1,v2的异或的值

    得到类型消息(Getting Type Information)

    函数

    说明

    isarray(x) 如果x是数组,返回true.否则false

    字符串转变函数(String-Translation Functions)

    函数

    说明

    bindtextdomain(directory [, domain]) 设置awk要搜寻信息的目录和域
    dcgettext(string [, domain [, category]]) 返回的字符串string 翻译文本域domain 的语言环境类别category
    dcngettext(string1, string2, number [, domain [, category]])

    返回string1和string2的翻译数量的复数形式,string1,string2在语言环境类别的文本域里

    松开函数还应该有个别高端性子,等多数实例,未来有空子补充。

     二. 自定义函数

    格式入下:

    复制代码 代码如下:

    function name([parameter-list])  
    {  
      body-of-function  
    }  

    如:

    复制代码 代码如下:

    function myprint(num)  
    {  
      printf "%6.3gn", num  
    }

     awk这么些命令还大概有大多效用,筹算就只写这么多了。以往可能越多在有的例证里,与其余命令结合时会提到。

    您只怕感兴趣的随笔:

    • 一天二个shell命令 linux好管家-磁盘-du命令安详严整
    • 一天贰个shell命令 linux好管家-进度-ps命令详细明白
    • 一天三个shell命令 linux文件内容操作体系-cat命令精解
    • 一天多少个shell命令 linux文本内容操作连串-sed命令详细明白
    • 一天四个shell命令 linux文本内容操作种类-cut命令详细解释
    • 一天一个shell命令 linux文本内容操作连串-grep命令详细解释
    • 一天三个shell命令 linux文本操作种类-tree命令详明
    • Linux shell下叁12个风趣的授命和提醒(推荐卡塔尔国

    本文由澳门新葡4473网站发布于新葡亰平台娱乐,转载请注明出处:一天一个shell命令 linux文本内容操作系列-awk命令

    关键词: