【问题标题】:extract part of a file path between pattern using awk使用 awk 提取模式之间的文件路径的一部分
【发布时间】:2016-10-24 05:35:48
【问题描述】:

我正在尝试从文件路径列表中提取数据,因为我正在寻找已完成加载的文件日志。问题是每个文件路径不一致,所以我需要在两个正则表达式模式之间查找文件路径的一部分。

例如说我要提取两条信息...假设/system/.../之间的数据和/data/.../sales/之间的另一条数据

/user/project-x/system/ibm/nyc/data/customers/sales/yyyymmdd
/user/project-x/system/mysql/data/regional/sales/yyyymmdd
/user/project-x/system/mysql/london/data/customers/sales/yyyymmdd
/user/project-x/system/oracle/data/tokyo-customers/Sales/yyyymmdd

所以当我运行 awk 脚本时,我会留下...

ibm      customers
mysql    regional
mysql    customers
oracle   tokyo-customers

有没有办法进行那种类型的文件路径拆分?

【问题讨论】:

    标签: bash awk


    【解决方案1】:

    我看到你的路径部分是固定的,所以不需要使用正则表达式。 字段分离可以解决问题:

    awk -F/ '{print $4,$7}' test.txt
    

    (其中test.txt 是您的输入文件)

    基本上,您是在告诉 awk 将斜杠视为字段分隔符,并打印字段 #4 和 #7。

    但是要通过字段查找来回答您的问题,请执行此操作(虽然更复杂)

    awk -F/ '{a="???";b="???";for (i=0;i<NF;i++) {if (tolower($i)=="system") a= $(i+1); if (($i=="data") && (tolower($(i+2))=="sales")) b = $(i+1)}; print a,b}' test.txt
    

    这将像以前一样拆分字段,但会查找上一个/下一个字段值并打印下一个/上一个字段。即使这些字段不在可以工作的固定位置。 如果找不到模式,则会显示???

    我已经包含了小写转换,因为Sales 混合大小写。

    【讨论】:

    • 感谢您的快速响应和近乎完美,问题是我不能依赖提交的编号,因为即使在我的简单示例中,我想要的列也不全在列 $7 中。有没有办法计算最后一列的位置并执行 $n-2 之类的操作?
    • 查看我的编辑。我意识到我并没有真正回答所提出的问题。
    【解决方案2】:

    sed:

    sed -E 's_.*/system/([^/]+).*/data/([^/]+)/[Ss]ales/.*_\1 \2_'
    
    • .*/system/([^/]+).*匹配/system/之后的部分,直到下一个/,并放入捕获的组1

    • /data/([^/]+)/[Ss]ales/ 匹配/data//sales/(或/Sales/)之间的部分并放入第二个捕获组

    • 在替换中使用捕获的组,以空格分隔

    示例:

    $ cat file.txt
    /user/project-x/system/ibm/nyc/data/customers/sales/yyyymmdd
    /user/project-x/system/mysql/data/regional/sales/yyyymmdd
    /user/project-x/system/mysql/london/data/customers/sales/yyyymmdd
    /user/project-x/system/oracle/data/tokyo-customers/Sales/yyyymmdd
    
    $ sed -E 's_.*/system/([^/]+).*/data/([^/]+)/[Ss]ales/.*_\1 \2_' file.txt
    ibm customers
    mysql regional
    mysql customers
    oracle tokyo-customers
    

    【讨论】:

    • 很好,也很灵活!
    猜你喜欢
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    • 2011-12-26
    • 2017-06-30
    • 2023-01-13
    • 1970-01-01
    相关资源
    最近更新 更多