提问人:DDisciple 提问时间:4/16/2019 最后编辑:AnubisDDisciple 更新时间:4/16/2019 访问量:622
使用 grep 从文本文件中提取一行?
Extract a line from a text file using grep?
问:
我有一个名为 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。
谢谢。
答:
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
通过替换来测试它,看看你得到了什么。如果看起来正确,请切换回去。sh
cat
简而言之,也许可以实现类似的东西,但无论如何,您最终都必须解析输出以配对输出行。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
评论
$@