我对if
声明有疑问。在WEDI_RC
中保存的日志文件格式如下:
name_of_file date number_of_starts
我想比较第一个参数$1
和第一列,如果它是真的而不是增量的起始数。当我启动我的脚本时它可以工作但只有一个文件,例如:
file1.c 11:23:07 1
file1.c 11:23:14 2
file1.c 11:23:17 3
file1.c 11:23:22 4
file2.c 11:23:28 1
file2.c 11:23:35 2
file2.c 11:24:10 3
file2.c 11:24:40 4
file2.c 11:24:53 5
file1.c 11:25:13 1
file1.c 11:25:49 2
file2.c 11:26:01 1
file2.c 11:28:12 2
每当我更改文件时,它都从1开始计数。我需要在结束时继续计数。
希望你理解我。
while read -r line
do
echo "line:"
echo $line
if [ "$1"="$($line | grep ^$1)" ]; then
number=$(echo $line | grep $1 | awk -F'[ ]' '{print $3}')
else
echo "error"
fi
done < $WEDI_RC
echo "file"
((number++))
echo $1 `date +"%T"` $number >> $WEDI_RC
答案 0 :(得分:1)
我没有得到你想要用你的测试[ "$1"="$($line | grep ^$1)" ]
完成的东西,但似乎你正在检查该行是从第一个参数开始的。
如果是这样,我认为你可以:
-o
选项,以便只打印匹配的输出(所以$1
)[[ "$line" =~ ^"$1" ]]
作为测试。答案 1 :(得分:1)
至少有两种方法可以解决问题。最简洁的可能是:
echo "$1 $(date +"%T") $(($(grep -c "^$1 " "$WEDI_RC") + 1))" >> "$WEDI_RC"
但是,如果你想分别对每个文件进行计数,你可以使用关联数组,假设你有Bash版本4.x(例如Mac OS X上提供的不是3.x)。此代码假定文件格式正确(以便每次文件名更改时计数不会重置为1)。
declare -A files # Associative array
while read -r file time count # Split line into three variables
do
echo "line: $file $time $count" # One echo - not two
files[$file]="$count" # Record the current maximum for file
done < "$WEDI_RC"
echo "$1 $(date +"%T") $(( ${files[$1]} + 1 ))" >> "$WEDI_RC"
代码使用read将行拆分为三个单独的变量。它回应它读取的内容并记录当前的计数。循环完成后,它会回显要追加到文件的数据。如果该文件是新文件(尚未在文件中提及),那么您将获得1
。
如果您需要处理损坏的文件作为输入,那么您可以修改代码以计算文件的条目数,而不是信任count
值。递增变量时,(( … ))
操作中使用的裸阵列引用符号是必需的;你不能将${array[sub]}++
与增量(或减量)运算符一起使用,因为它的计算结果是数组元素的值,而不是它的名字!
declare -A files # Associative array
while read -r file time count # Split line into three variables
do
echo "line: $file $time $count" # One echo - not two
((files[$file]++)) # Count the occurrences of file
done < "$WEDI_RC"
echo "$1 $(date +"%T") $(( ${files[$1]} + 1 ))" >> "$WEDI_RC"
您甚至可以检测格式是破碎还是固定格式:
declare -A files # Associative array
while read -r file time count # Split line into three variables
do
echo "line: $file $time $count" # One echo - not two
if [ $((files[$file]++)) != "$count" ]
then echo "$0: warning - count out of sync: ${files[$file]} vs $count" >&2
fi
done < "$WEDI_RC"
echo "$1 $(date +"%T") $(( ${files[$1]} + 1 ))" >> "$WEDI_RC"