Bash 不能';我不明白这个命令。有人能解释一下吗?
还有:Bash 不能';我不明白这个命令。有人能解释一下吗?,bash,awk,sed,Bash,Awk,Sed,还有: sed -i 's/^ /0/' inputfile 在上面的脚本中,getDate将临时文件中的时间戳更新到第二天,printTimestamp将在另一个文件中使用更新的时间戳打印以下行: awk '{if (previoustime>$1) {{system("getDate")}{system("printTimestamp")}{print ""}} {previoustime=$1} {print
sed -i 's/^ /0/' inputfile
在上面的脚本中,getDate将临时文件中的时间戳更新到第二天,printTimestamp将在另一个文件中使用更新的时间戳打印以下行:
awk '{if (previoustime>$1)
{{system("getDate")}{system("printTimestamp")}{print ""}}
{previoustime=$1}
{print $0}
}' inputfile
第一个命令在一行的开头(
^
)查找两个空格的任何实例,并用0
替换它们(s/
)
-i
表示sed
正在操作的文件被修改到位。否则,修改后的版本将被写入控制台(stdout),但不会更改原始文件
您的第二个命令是更新时间戳,是的。它能够比较两次,因为
sed
命令用0
替换了尾随空格。完成后,字符串比较会告诉您是否一次接一次,只需使用字母数字顺序即可。如果没有sed
命令,您将得到奇怪的结果:3:00:00
将位于21:00:00
之后,因为3
位于2
之后。第一个命令在一行的开头(^
)找到两个空格的任何实例,并用0
替换它们(s/
)
-i
表示sed
正在操作的文件被修改到位。否则,修改后的版本将被写入控制台(stdout),但不会更改原始文件
您的第二个命令是更新时间戳,是的。它能够比较两次,因为
sed
命令用0
替换了尾随空格。完成后,字符串比较会告诉您是否一次接一次,只需使用字母数字顺序即可。如果没有sed
命令,您将得到奇怪的结果:3:00:00
将位于21:00:00
之后,因为3
位于2
之后sed脚本将行开头的两个空格(由^
表示)替换为0sed脚本将行开头的两个空格替换为0(由^
表示)由0表示,搜索正则表达式在行首有两个空格。替换项是数字0。
-i
选项意味着“就地”:编辑的结果被写回源文件(而不是stdout)。搜索正则表达式在行首有两个空格。替换项是数字0。
-i
选项的意思是“就地”:编辑的结果被写回源文件(而不是stdout)。oook!!那么我猜它是在尝试以特定格式制作时间戳,如“4:23:30”到“04:23:30”…是的,第一个问题解决了。对第二个脚本有什么想法吗?@JeevanPatnaik我已经编辑了我的答案来解释第二个部分。好吧!!那么我想它是想用一种特定的格式来制作时间戳,比如“4:23:30”到“04:23:30”…是的,第一个问题解决了。关于第二个脚本有什么想法吗?@JeevanPatnaik我已经编辑了我的答案来解释第二个部分。你能发布代码getDate
和printTimestamp
?@user1984289 hi发布了!awk命令是一个试图将awk用作shell的人,这是不合适的。它们的语法是荒谬的错误,这是一个拥抱提示他们不知道自己在做什么。所有这些shell和sed内容都可以在一个简单的小awk脚本中轻松完成。如果你发布另一个问题,并带有示例输入和预期输出,并用awk
标记它,有人会告诉你怎么做。你能发布代码getDate
和printTimestamp吗
?@user1984289 hi posted!awk命令是指有人试图将awk用作shell,这是不合适的。他们的语法错误得离谱,这是一个巨大的线索,表明他们不知道自己在做什么。所有这些shell和sed内容都可以在一个简单的小awk脚本中轻松完成。如果你用示例输入和预期输出,并用awk
标记,有人会告诉您如何操作。
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
}