无法理解这个sed命令。有谁能解释一下?

时间:2014-09-30 07:27:55

标签: bash awk sed

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>
  1. 在第一个脚本中,'tux'之后的两个空格是什么意思?
  2. 在第二个脚本中,$ 1表示第一列,此处输入文件中的第一列是时间。如何比较两次?
  3. 以下是输入文件格式:

    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
    }
    

3 个答案:

答案 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)。