我有以下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保存在变量中?
答案 0 :(得分:1)
您可以先将其存储在变量中:
read -r FIRST < <(exec grep -Po '(?<=PROGRAM\()[^\)]+(?=\))' /home/programs/hello_word.sh) && grep -e "$FIRST" /home/leherad/pgm_currentdate
#!/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