sed -i 's/^ /0/' inputfile
还有这个:
awk '{if (previoustime>$1)
{{system("getDate")}{system("printTimestamp")}{print ""}}
{previoustime=$1}
{print $0}
}' inputfile
在上面的脚本中, getDate 会将临时文件中的时间戳更新到第二天, printTimestamp 将在另一个文件中打印带有更新时间戳的以下行: / p>
00:00:01 (lmgrd) TIMESTAMP <Date>
以下是输入文件格式:
21:49:32 (lmgrd) MLM using TCP-port 37034
21:51:08 (MLM) TCP_NODELAY NOT enabled
3:49:30 (lmgrd) TIMESTAMP 5/18/2014
3:54:33 (MLM) TIMESTAMP 5/18/2014
9:49:30 (lmgrd) TIMESTAMP 5/18/2014
9:59:37 (MLM) TIMESTAMP 5/18/2014
getMonthDays () {
MAX=31
if [ $1 -eq 2 ]; then
MAX=29
fi
cal $1 $2 | grep $MAX >> /dev/null
printf $((MAX-$?))
}
getDate () {
if [ -f OUTPUTDATE.tmp ]; then
IN=$(cat OUTPUTDATE.tmp)
MONTH=$(echo $IN | cut -d \/ -f 1)
DAY=$(echo $IN | cut -d \/ -f 2)
YEAR=$(echo $IN | cut -d \/ -f 3)
MDAYS=$(getMonthDays $MONTH $YEAR)
(((DAY+=1)>MDAYS)) && ((DAY=1)) && (((MONTH+=1)>12)) && ((MONTH=1)) && ((YEAR+=1))
OUTPUTDATE="$MONTH/$DAY/$YEAR"
echo $OUTPUTDATE > OUTPUTDATE.tmp
fi
}
printTimestamp () {
if [ -f OUTPUTDATE.tmp ]; then
OUTPUTDATE=$(cat OUTPUTDATE.tmp)
printf %s "00:00:01 (lmgrd) TIMESTAMP "$OUTPUTDATE
fi
}
答案 0 :(得分:2)
第一个命令在一行的开头(^
)找到两个空格的任何实例,并用s//
替换它们(0
)。
-i
表示sed
正在运行的文件已被修改到位。如果没有这个,修改后的版本将被写入控制台(stdout),但不会更改原始文件。
你的第二个命令正在更新时间戳,是的。它可以比较两次,因为 sed
命令用0
替换尾随空格。一旦完成,字符串比较会告诉您一次是否一次又一次,只是使用字母数字排序。如果没有sed
命令,您会得到奇怪的结果:3:00:00
会在21:00:00
后出现,因为3
位于2
之后。
答案 1 :(得分:1)
sed脚本将行开头的2个空格(由^
表示)替换为0
答案 2 :(得分:1)
搜索正则表达式是行首的两个空格
替换项是数字0
-i
选项意味着“就地”:编辑结果被写回源文件(而不是stdout)。