如何打印管道第一部分的结果?

时间:2014-08-04 10:22:59

标签: linux bash grep xargs

我有以下grep:

grep -Po '(?<=PROGRAM\()[^\)]+(?=\))' /home/programs/hello_word.sh 

PROGRAM()

之间显示字符串
RECTONTER

然后,我需要知道这些提取的字符串是否包含在文件中,所以:

grep -Po '(?<=PROGRAM\()[^\)]+(?=\))' /home/programs/hello_word.sh | xargs -I % grep -e % /home/leherad/pgm_currentdate

文件内容:

RECTONTER
CORASFE
RENTOASD
UBICARP

如果找到它,则返回/ home / leherad / pgm_currentdate的行,但我想打印在第一个grep(RECTONTER)中提取的行。如果没有找到,则不会返回任何内容。

有一种简单的方法可以做到这一点,或者我不应该复杂化并且更好地构建脚本并将第一个grep保存在变量中?

2 个答案:

答案 0 :(得分:1)

您可以先将其存储在变量中:

read -r FIRST < <(exec grep -Po '(?<=PROGRAM\()[^\)]+(?=\))' /home/programs/hello_word.sh) && grep -e "$FIRST" /home/leherad/pgm_currentdate

更新01

#!/bin/bash
shopt -s nullglob
for FILE in /home/programs/*; do
    read -r FIRST < <(exec grep -Po '(?<=PROGRAM\()[^\)]+(?=\))' "$FILE") && grep -e "$FIRST" /home/leherad/pgm_currentdate && echo "$FIRST"
done

答案 1 :(得分:0)

我认为解决这个问题的直接方法是使用函数。

此外,您的grep模式将匹配shell注释,当有多个匹配项时,这可能会导致xargs命令出现意外行为;你可能想采取措施只抓住第一场比赛。在没有真正看到输入文件的情况下很难说,所以我猜这是好的,或者评论实际上是你的目标模式的预期位置。

无论如何,我最好猜测一个适合你的功能。

get_program() {
  local filename="$1"
  local program="$( grep -m1 -Po '(?<=PROGRAM\()[^\)]+(?=\))' "$filename" )"
  if grep -q -e "$program" /home/leherad/pgm_currentdate; then
    echo $program
    grep -e "$program" /home/leherad/pgm_currentdate
  fi
}

get_program /home/programs/hello_word.sh