![如果日期匹配,则返回某些字段](https://linux22.com/image/1004547/%E5%A6%82%E6%9E%9C%E6%97%A5%E6%9C%9F%E5%8C%B9%E9%85%8D%EF%BC%8C%E5%88%99%E8%BF%94%E5%9B%9E%E6%9F%90%E4%BA%9B%E5%AD%97%E6%AE%B5.png)
2017-11-27 20:11:13,632 INFO abc: [java: Thread-389579]: Completed executing command
2017-11-27 20:11:13,632 INFO abc: [java: Thread-389579]: OK
2017-11-27 20:11:13,632 INFO abc: [java: Thread-389579]: <completed>
2017-11-27 20:11:13,632 INFO abc: [java: Thread-389579]: release for adeo/student
我的方法:
awk 'today="$(date +'%Y-%m-%d')" ($1 = today) && /Completed executing command/ {cnr = NR} NR == (cnr+3) {gsub(/\/.*/,"",$NF); print $NF}' filename
awk 'today="$(date +'%Y-%m-%d')" ($1 == today) && /Completed executing command/ { cnr = NR } NR == (cnr+3) { sub("/.*","",$NF); print $NF }' filename
我们只想打印两个不同变量中的adeo
和student
。条件是如果 $1 等于当前日期,则它应该Completed executing command
在整个文件中搜索,然后跳过两行,然后打印adeo
和student
。(名称 adeo/student 不是固定的,它会改变,所以在上面的例子中,我们想要 adeo 和 student ,但如果有其他名称,则应该显示其他名称)。
从我们的方法中我们只得到了adeo
。我们如何使用awk
/ sed
/grep
或任何其他工具来实现这一点?
答案1
我从评论中得知,您希望输出看起来像这样name1=adeo name2=student
。如果是这样,请尝试:
$ awk -v today="$(date +'%Y-%m-%d')" '$1 == today && /Completed executing command/ { cnr = NR } cnr && NR == cnr+3 {sub(/\//, " name2=", $NF); print "name1="$NF }' filename
name1=adeo name2=student
答案2
使用外部变量的一种方法是将其放入today
环境中,然后ENVIRON["today"]
在其中使用。如果您只想获取姓名和学生部分,并且它们始终是行中的最后一项,则awk
使用也是不必要的。gsub()
$ today=$(date +'%Y-%m-%d') awk '$1 = ENVIRON["today"] && /Completed executing command/ {cnr = NR} NR == (cnr+3) {print $NF}' input.txt
adeo/student