Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用awk提取模式之间的部分文件路径_Bash_Awk - Fatal编程技术网

Bash 使用awk提取模式之间的部分文件路径

Bash 使用awk提取模式之间的部分文件路径,bash,awk,Bash,Awk,我试图从文件路径列表中提取数据,因为我希望创建已完成加载的文件日志。问题是每个文件路径都不一致,所以我需要在两个正则表达式模式之间查找部分文件路径 例如,假设我想提取两条信息……比如说,在/system/../之间的数据和在/data/../之间的另一条数据/ /user/project-x/system/ibm/nyc/data/customers/sales/yyyymmdd /user/project-x/system/mysql/data/regional/sales/yyyymmdd

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

例如,假设我想提取两条信息……比如说,在/system/../之间的数据和在/data/../之间的另一条数据/

/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

还有什么方法可以进行这种类型的文件路径拆分吗?

我发现您的路径部分是固定的,所以不需要使用正则表达式。 字段分离实现了以下目的:

awk -F/ '{print $4,$7}' test.txt
(其中,
test.txt
是您的输入文件)

基本上,你告诉代码< AWK < /C> >将斜线视为字段分隔符,打印字段为4和7。 但要用字段查找回答您的问题,请执行以下操作(尽管更复杂)

awk-F/'{a=“???”b=“???”for(i=0;i带
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

感谢您的快速响应和近乎完美的回复,问题是我不能依赖文件编号,因为即使在我的简单示例中,我想要的列也不都在第7列中。有没有办法计算最后一列的位置和执行类似于$n-2的操作?请参阅我的编辑。我意识到我并没有真正回答所问的问题这很好,也很灵活!
$ 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