我有一个很长的文件夹列表,每个文件夹中都有文件“log.dat”。我想读取该文件中特定行的值。我将文件夹名称保存在父文件夹中的文件“All.txt”中,然后运行以下代码:
#!/bin/bash
in=/a/b/c #path to the file All.txt
for i in $(cat $in/all.txt); do
sed -n '/price/p' ${in}/${i}/log.dat
done
这段代码能够读取几乎所有文件,但由于某种原因,我无法弄清楚!输出了以下错误消息:
/log.dat: No such file or directory #(then the path to this file)
sed -n '/price/p' log.dat
如果我在输出错误消息的文件夹内运行命令。我得到答案了!
PS:ALL.txt文件(在父文件夹中运行命令创建)内容ls>All.txt
如下:
STR-548-021-01
STR-548-021-02
STR-548-022-01
STR-548-022-02
STR-548-023-01
STR-548-023-02
.
.
.
.
.
我尝试使用命令“awk”而不是“sed”,如下所示:
awk '{ price }' ${in}/${i}/log.dat
我收到了同样的错误消息。
这些回车符可以作为命令 ls>All.txt 的输出出现在 Linux 中吗?
答案1
有回车在 的末尾$i
,因为 中的行末尾有回车符all.txt
。它可能是在 Windows 上生成的:Windows 使用两个字符序列 CR、LF 来标记换行符,而 Unix(以及世界上的大多数其他地方)仅使用 LF(换行符,Unix 世界中换行符的同义词),所以 Unix 会看到一行末尾带有 CR。
将文件转换为 Unix 行结尾,或去掉 CR:
for i in $(cat $in/all.txt); do
i=${i%$'\r'}
sed -n '/price/p' ${in}/${i}/log.dat
done
如果行尾没有 CR,这不会执行任何操作。解释:$'\r'
是一个回车符, 和${i%…}
i
是减去指定后缀的值
请注意,您的脚本需要空格分隔的输入,而不是每行一个文件,并且输入是通配符模式列表,而不是文件名。看为什么我的 shell 脚本会因为空格或其他特殊字符而卡住?。如果输入中没有空格或通配符,这没有什么区别。
答案2
您的错误消息表明 sed 正在获取 /log.dat 的参数 - $i 或 $in 都没有设置为任何值。我认为您的 All.txt 文件中有一个空行。
/log.dat: 没有这样的文件或目录#(然后是该文件的路径)