更容易使用python作为awk的替代

awking的Python项目详细描述


awking

更容易使用python作为awk的替代。

基本用法

提取线组

fromawkingimportRangeGrouperlines='''text 1text 2group start 1text 3group end 1text 4group start 2text 5group end 2text 6'''.splitlines()forgroupinRangeGrouper('start','end',lines):print(list(group))

这将输出:

['group start 1', 'text 3', 'group end 1']
['group start 2', 'text 5', 'group end 2']

提取固定宽度字段

fromawkingimportrecordsps_aux='''USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMANDroot         1  0.0  0.0  51120  2796 ?        Ss   Dec22   0:09 /usr/lib/systemd/systemd --system --deserialize 22root         2  0.0  0.0      0     0 ?        S    Dec22   0:00 [kthreadd]root         3  0.0  0.0      0     0 ?        S    Dec22   0:04 [ksoftirqd/0]root         5  0.0  0.0      0     0 ?        S<   Dec22   0:00 [kworker/0:0H]root         7  0.0  0.0      0     0 ?        S    Dec22   0:15 [migration/0]root         8  0.0  0.0      0     0 ?        S    Dec22   0:00 [rcu_bh]root         9  0.0  0.0      0     0 ?        S    Dec22   2:47 [rcu_sched]saml      3015  0.0  0.0 117756   596 pts/2    Ss   Dec22   0:00 bashsaml      3093  0.9  4.1 1539436 330796 ?      Sl   Dec22  70:16 /usr/lib64/thunderbird/thunderbirdsaml      3873  0.0  0.1 1482432 8628 ?        Sl   Dec22   0:02 gvim -froot      5675  0.0  0.0 124096   412 ?        Ss   Dec22   0:02 /usr/sbin/crond -nroot      5777  0.0  0.0  51132  1068 ?        Ss   Dec22   0:08 /usr/sbin/wpa_supplicant -u -f /var/log/wpa_supplicasaml      5987  0.7  1.5 1237740 119876 ?      Sl   Dec26  14:05 /opt/google/chrome/chrome --type=renderer --lang=en-root      6115  0.0  0.0      0     0 ?        S    Dec27   0:06 [kworker/0:2]'''foruser,_,commandinrecords(ps_aux.splitlines(),widths=[7,58,...]):print(user,command)

这将输出:

USER    COMMAND
root    /usr/lib/systemd/systemd --system --deserialize 22
root    [kthreadd]
root    [ksoftirqd/0]
root    [kworker/0:0H]
root    [migration/0]
root    [rcu_bh]
root    [rcu_sched]
saml    bash
saml    /usr/lib64/thunderbird/thunderbird
saml    gvim -f
root    /usr/sbin/crond -n
root    /usr/sbin/wpa_supplicant -u -f /var/log/wpa_supplica
saml    /opt/google/chrome/chrome --type=renderer --lang=en-
root    [kworker/0:2]

问题

你有没有扫描过一个xmls的日志文件?对你来说有多难 将一组多行XML提取到单独的文件中?

您可以使用re.findallre.finditer,但需要读取整个日志 先将文件放入字符串中。您也可以使用这样的awk脚本:

#!/usr/bin/awk -f/^Payload: <([-_a-zA-Z0-9]+:)?Request/{ofname="request_"(++index)".xml"sub(/^Payload: /,"")}/<([-_a-zA-Z0-9]+:)?Request/,/<\/([-_a-zA-Z0-9]+:)?Request/{print>ofname}/<\/([-_a-zA-Z0-9]+:)?Request/{if(ofname){close(ofname)ofname=""}}

这很管用,而且相当不错。(尽管这是一个python模块,我还是鼓励您 如果您还不知道awk,可以学习它。)

但是如果您想在python应用程序中构建这种东西呢? 如果输入的不是文件中的行,而是不同类型的对象,该怎么办?

使用awking

的python等价物

输入iterable中的RangeGrouper类根据 开始和结束元素的谓词。这有点像Perl的范围 运算符或awk的范围模式,除了您的范围被分组到 START..END可重复。

与上述awk脚本类似的脚本可能如下:

fromawkingimportRangeGrouperimportreimportsysg=RangeGrouper(r'^Payload: <([-_a-zA-Z0-9]+:)?Request',r'</([-_a-zA-Z0-9]+:)?Request',sys.stdin)forindex,requestinenumerate(g,1):withopen(f'request_{index}.xml','w')asf:forlineinrequest:line=re.sub(r'^Payload: ','',line)# Not optimalprint(line,file=f,end='')

谓词可以是正则表达式,作为re.compile()对象或 字符串;或者它们可以是任何接受单个参数并返回 真/假值。

注意事项

分组算法惰性地读取输入iterable。你还可以跑出去 如果保留对以前组的引用而不使用它们,则会占用内存。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
多线程在java中是否可以自动创建线程?根据标准   java什么是模型。在playframework中刷新do(1.2.4)   java数据正在三个不同的适配器中被覆盖   当使用Java驱动程序更新MongoDB的数据时,数据库id被内部对象的_id替换   java调用vkCmdDraw会使用LWJGL导致本机崩溃   for循环中的java增量给出了不同的答案   java中用于密码验证的正则表达式,允许某些特殊字符,但不是必需的   安卓 Java ExecutorService任务/可调用未取消/中断   java Jmeter远程测试:。RemoteJMeterEngineImpl_存根(无安全管理器:RMI类加载程序已禁用)   java在drools drl中使用POJO的hashmap   带hibernate的java BigQuery   JAVA网StAX解析XML文件时出现异常   java ODK聚合未启动。多重例外   使用序列图进行java编码   moduleinfo中的java Javadoc注释   java Mockito when()。thenReturn()在返回空列表时返回Null   朱尼特和詹金斯组织。朱尼特。contrib。JAVAlang.system。内部的CheckExitCalled:尝试以状态0退出   java如何创建用户定义的JLabel,JTextField?