Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 不能';我不明白这个命令。有人能解释一下吗?_Bash_Awk_Sed - Fatal编程技术网

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脚本将行开头的两个空格(由
^
表示)替换为0

sed脚本将行开头的两个空格替换为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
}