假设我有一个包含以下文本的文件。
我正在阅读的源文件是这样的:
#0 abc 2016-08-06 01:12:57 AM 9.1% 779.9M of 1G 156.3M of 1G
#1 abc 2016-08-06 02:33:47 AM 12.1% 339.9M of 1G 126.3M of 1G
以下是我正在使用的脚本
#!/bin/bash
opFile="opfile.txt"
sourceFile="TestOutput"
if [[ ! -e "$opFile" ]]
then
{
touch $opFile
count=0
grep "#" "$sourceFile" | while read -r line ; do
{
cpu=$(grep "#$count" "$sourceFile" | cut -f 4 | cut -d% -f1)
mem=$(grep "#$count" "$sourceFile" | cut -f 5 | cut -dM -f1)
disk=$(grep "#$count" "$sourceFile" | cut -f 6 | cut -dM -f1)
echo -e "$cpu\n$mem\n$disk" >> "$opFile"
((count++))
}
done
}
else
{
count=0
lineCounter=0
grep "#" "$sourceFile" | while read -r line ; do
{
cpu=$(grep "#$count" "$sourceFile" | cut -f 4 | cut -d% -f1)
mem=$(grep "#$count" "$sourceFile" | cut -f 5 | cut -dM -f1)
disk=$(grep "#$count" "$sourceFile" | cut -f 6 | cut -dM -f1)
((lineCounter++))
sed ""$lineCounter"s/$/,"$cpu"/" "$opFile" | tee "$opFile"
((lineCounter++))
sed ""$lineCounter"s/$/,"$mem"/" "$opFile" | tee "$opFile"
((lineCounter++))
sed ""$lineCounter"s/$/,"$disk"/" "$opFile" | tee "$opFile"
((count++))
}
done
}
fi
现在,该脚本需要在该 $sourceFile 上运行多次,因为该文件中的数字会不断变化。所以第一次运行脚本时,输出是这样的
9.1
779.9
156.3
12.1
339.9
126.3
第二次运行时(假设源文件中的值相同),输出应该如下所示。
9.1,9.1
779.9,779.9
156.3,156.3
12.1,12.1
339.9,339.9
126.3,126.3
现在,我使用的 sed 行是正确的,我很确定,但是在将其放入文件中时遇到了问题。我本可以使用 >> 输出重定向器,但这会将所有内容打印在新行上。 Tee 的工作有点出乎意料,有时它会做正确的事情,其他时候,我的 opfile.txt 是空的。关于如何将 sed 输出正确放入文件中的任何想法?不,最好,我不希望在标准输出上显示任何内容。
谢谢!
答案1
错误的是我试图写入我正在读取的同一个文件。因此,当您使用 > 写入文件时,当文件打开时,它会在 sed 将其内容放入其中之前被截断,从而形成空文件(这是我的想法,如果我错了,请纠正我)。类似的逻辑也一定是为什么 tee 如此出人意料地工作的逻辑。
最后,一位 stackoverflow 朋友建议的解决方法以一种更简单的方式实现了这一点。
paste -d, output.txt <(grep -oP '[0-9.]+(?=%)|[0-9.]+(?=[A-Z]+ of)' source.txt) > tmp ; mv tmp output.txt
因此,为了防止这种脏读问题的发生,使用了临时文件。谢谢大家的帮助。