3

我有一个很好用的脚本,但在那个脚本中我使用 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

4 回答 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

可以使用-Fflag 设置 使用的字段分隔符awk,默认分隔符是空格。这会将输入拆分为$1, $2, . . . , $NF字段。

awk有一个预定义的功能split

n = split( String, A, [Ere] )

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

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

最终输出将如下所示:

filename1 string1
filename1 string2
filename2 string1
于 2014-04-28T09:59:00.710 回答
1

PATH是查找可执行文件的搜索路径,而不是常规文件,因此它不起作用。在你的 crontab 命令中试试这个:

cd /home/username/scriptfolder/logs; grep -e "string1" -e "string" my_fliles* >> //destination
于 2013-06-24T05:15:18.533 回答
0

grep如果您在目录之外进行操作,我不确定是否有办法抑制路径。但是,您可以使用awk来剥离路径。就像是:

awk -F/ '{print $NF}' <(grep -e "string1" -e "string" /home/username/scriptfolder/logs/my_fliles*) > destination
于 2013-06-24T05:09:36.320 回答
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

于 2013-06-24T05:17:21.923 回答