使用 grep 从文本文件中提取一行?

Extract a line from a text file using grep?

提问人:DDisciple 提问时间:4/16/2019 最后编辑:AnubisDDisciple 更新时间:4/16/2019 访问量:622

问:

我有一个名为 log.txt 的文本文件,它记录了文件名和获取它的路径。所以像这样的东西

2.txt
/home/test/etc/2.txt

基本上是文件名及其以前的位置。我想使用 grep 抓取文件目录,将其保存为变量并将文件移回其原始位置。

for var in "$@"
do
if grep "$var" log.txt
then
    # code if found
else
    # code if not found
fi

这只是将 2.txt 及其目录打印到控制台,因为目录中有 2.txt。

谢谢。

bash 外壳

评论

0赞 Anubis 4/16/2019
您传递给已发布脚本的参数是什么?$@
0赞 Jonathon K 4/16/2019
您确定“log.txt”不会在整个文件中出现多个吗?

答:

1赞 Paul Hodges 4/16/2019 #1

也许翻转逻辑以使其更有效率?

f=''
while read prev
do case "$prev" in
   */*) f="${prev##*/}"; continue;; # remember the name
     *) [[ -e "$f" ]] && mv "$f" "$prev";;
done < log.txt

这将遍历日志中的所有文件,如果它们存在于本地,请将它们移回。在没有每个文件的情况下,功能应该相同。grep

如果名称始终相同,那么为什么要将其保存在日志中呢?
如果是,那么

while read prev
do f="${prev##*/}" # strip the path info
   [[ -e "$f" ]] && mv "$f" "$prev" 
done < <( grep / log.txt )

评论

0赞 Paul Hodges 4/16/2019
看起来您更改了 OP 中的格式。移动后文件名是否始终相同?输入文件是一行带有 falename 裸露的行,然后是另一行带有原始路径?
-1赞 drkicknrush 4/16/2019 #2

grep -q(表示“安静”)停止输出

0赞 tripleee 4/16/2019 #3

将文件名放在同一行上将大大简化脚本。但也许可以尝试类似的东西

# Convert from command-line arguments to lines
printf '%s\n' "$@" |
# Pair up with entries in file
awk 'NR==FNR { f[$0]; next }
    FNR%2 { if ($0 in f) p=$0; else p=""; next }
    p { print "mv \"" p "\" \"" $0 "\"" }' - log.txt |
sh

通过替换来测试它,看看你得到了什么。如果看起来正确,请切换回去。shcat

简而言之,也许可以实现类似的东西,但无论如何,您最终都必须解析输出以配对输出行。printf '%s\n' "$@" | grep -A 1 -Fxf - log.txt

0赞 Rafael Toledo 4/16/2019 #4

另一种解决方案:

for f in `grep -v "/" log.txt`; do 
    grep "/$f" log.txt | xargs -I{} cp $f {} 
done