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

时间:2019-04-16 13:18:02

标签: bash shell

我有一个名为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。

谢谢。

4 个答案:

答案 0 :(得分: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 )

答案 1 :(得分:0)

将文件名放在同一行将大大简化脚本。但也许尝试类似

byte[]

通过将# 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 替换为sh进行测试,看看会得到什么。如果看起来正确,请切换回去。

简而言之,cat可能会带来类似的结果,但最终您必须解析输出以将输出线配对。

答案 2 :(得分:0)

另一种解决方案:

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

答案 3 :(得分:-1)

grep -q(用于“安静”)停止输出