需要从grep的输出中去除路径,但不去除文件名

4

我有一个脚本,它运行得很好,但在该脚本中,我使用grep提取两行内容。

grep -e "string1" -e "string" my_fliles* >> //destination

看起来输出结果不错

filename1 string1
filename1 string2
filename2 string1
filename2 string2
filename3 string1
filename3 string2

这是期望的效果,但为了让它在cron作业中工作,我必须指定my_files的完整路径。

grep -e "string1" -e "string" /home/username/scriptfolder/logs/my_fliles* >> //destination

那会生成如下输出:
/home/username/scriptfolder/logs/filename1 string1
/home/username/scriptfolder/logs/filename1 string2
/home/username/scriptfolder/logs/filename2 string1
/home/username/scriptfolder/logs/filename2 string2
/home/username/scriptfolder/logs/filename3 string1
/home/username/scriptfolder/logs/filename3 string2

我希望能得到文件名和字符串输出,但不需要路径。 我尝试删除路径并在脚本中指定路径。

export PATH=$PATH:/home/username/scriptfolder/logs/

但那并没有起作用。有什么建议吗?
4个回答

2
grep -e "string1" -e "string" ./my_fliles* | 
awk -F " " '{ n = split($1,RES,"/"); OUT=RES[n];
for( i=2; i<=NF; i++) { OUT=OUT" "$i } print OUT;}'

grep 的结果中,路径和字符串之间用一个 ' '(空格)分隔。
/home/username/scriptfolder/logs/filename1 string1

你可以使用-F标志来设置awk使用的字段分隔符,默认分隔符是空格。 这将把输入拆分为$1,$2,...,$NF字段。 awk有一个预定义函数split
n = split( String, A, [Ere] )

该函数将由String参数指定的字符串分成数组元素A[1],A[2],...,A[n],并返回变量n的值。如果未提供Ere参数,则使用当前字段分隔符(FS特殊变量)或由Ere参数指定的扩展正则表达式进行分隔。除非上下文指示特定元素还应具有数值,否则A数组中的元素将创建为字符串值。

for( i=2; i<=NF; i++) { OUT=OUT" "$i }将把原始输入字段连接到由空格分隔的变量OUT中。这是为了确保我们不会因搜索的字符串string1string2中的空格而错过任何字段。请注意,循环从i=2开始。

最终输出如下:

filename1 string1
filename1 string2
filename2 string1

感谢您提供有效的解决方案,以及解释! - Marecky

1

PATH 是查找可执行文件的搜索路径,而不是普通文件,因此它无法起作用。在您的 crontab 命令中尝试这样做:

cd /home/username/scriptfolder/logs; grep -e "string1" -e "string" my_fliles* >> //destination

0

我不确定是否有办法在目录外使用grep时抑制路径。但是,您可以使用awk来剥离路径。类似于:

awk -F/ '{print $NF}' <(grep -e "string1" -e "string" /home/username/scriptfolder/logs/my_fliles*) > destination

0

如果你手动使用 grep -e "string1" -e "string" ./my_fliles* >> //destination,那么建议你编写一个包含这两行命令的脚本并运行该脚本。

cd /home/username/scriptfolder/logs/
grep -e "string1" -e "string" ./my_fliles* >> //destination

如果 grep -e "string1" -e "string" ./my_fliles* >> //destination 是脚本的一部分,则在此之前添加以下行:

cd /home/username/scriptfolder/logs/

然后再添加以下行:

grep -e "string1" -e "string" ./my_fliles* >> //destination


最好使用 pushd、popd 而不是 cd。 - UmNyobe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接