从服务器日志中解析作业名称

时间:2014-05-26 10:31:10

标签: bash parsing unix

日志输出行如下所示

  

HLGAPL65.HOU150.CHEVRONTEXACO.NET/UPSTREAM_MDM_D2/Jobs/Keystone   版本2.0.2.0/0.0。 Loading_SOR_to_Landing / EGI / EGI_WV_WELLHDR.pjb

我需要提取在最后一个" /"之后出现的名称。在" .pjb"

之前

在这种特殊情况下 - 所需名称为EGI_WV_WELLHDR。

最有效和最简单的方法是什么?

5 个答案:

答案 0 :(得分:2)

您可以使用此awk

$ awk -F"[/.]" '{print $(NF-1)}' file
EGI_WV_WELLHDR

解释

  • -F"[/.]"将分隔符设置为点或斜线。
  • {print $(NF-1)}根据这些字段分隔符打印倒数第二个字段。

如果您想要的是没有扩展名的文件名,那么您可以执行以下操作:

请参阅:

$ awk '{print $NF}' file
Loading_SOR_to_Landing/EGI/EGI_WV_WELLHDR.pjb
$ t=$(basename $(awk '{print $NF}' a))
$ echo "$t"
EGI_WV_WELLHDR.pjb
$ echo ${t%.*}
EGI_WV_WELLHDR

答案 1 :(得分:2)

尝试使用此sed命令,

$ sed -r 's/^.*\/([^.]*)\.pjb$/\1/g' file
EGI_WV_WELLHDR

-r - >扩展正则表达式。

^.*\/([^.]*)\.pjb$

以上正则表达式获取最后/.pjb之间的字符。然后通过反向引用打印组中提取的字符。

答案 2 :(得分:2)

使用sed,运行以下命令:

sed -r 's/.*\/([^\/]+)\.pjb/\1/g' logfile

答案 3 :(得分:1)

使用cutrev

rev | cut -d'/' -f1 | cut -d'.' -f2 | rev

答案 4 :(得分:0)

由于您的分隔符是斜杠,因此您可以使用basename

$ basename "HLGAPL65.HOU150.CHEVRONTEXACO.NET/UPSTREAM_MDM_D2/Jobs/Keystone Release 2.0.2.0/0.0. Loading_SOR_to_Landing/EGI/EGI_WV_WELLHDR.pjb" .pjb
EGI_WV_WELLHDR