2014-09-30 58 views
0
sed -i 's/^ /0/' inputfile 

而且這樣的:無法理解此sed命令。任何人都可以解釋它?

awk '{if (previoustime>$1) 
      {{system("getDate")}{system("printTimestamp")}{print ""}} 
      {previoustime=$1} 
      {print $0} 
    }' inputfile 

在上面的腳本,GETDATE將在臨時文件到第二天printTimestamp更新時間戳將打印以下行與另一個更新的時間戳文件:

00:00:01 (lmgrd) TIMESTAMP <Date> 
  1. 在第一個腳本,以後有什麼做的兩個空間'tux'是什麼意思?
  2. 在第二個腳本中,$ 1表示第一列,這裏輸入文件中的第一列是時間。它如何比較兩次?

下面是輸入文件格式:

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

你能發佈代碼'getDate'和'printTimestamp'嗎? – Fazlin 2014-09-30 07:36:15

+0

@ user1984289您好! – 2014-09-30 07:39:01

+0

awk命令是有人試圖使用awk作爲它不適合的shell。他們的語法是荒謬的錯誤,這是一個巨大的線索,他們不知道他們在做什麼。所有這些shell和sed的東西都可以在一個小而簡單的awk腳本中輕鬆完成。如果你用樣本輸入和預期輸出發佈另一個問題並用'awk'標記它,有人會告訴你如何去做。 – 2014-10-01 13:39:31

回答

2

第一個命令發現兩個空間的任何實例在一行的開始(^),並用0替換它們(s//)。

-i意味着sed正在操作的文件被替代修改。沒有這個,修改後的版本會被寫入控制檯(stdout),但不會更改原始文件。

你的第二個命令是更新時間戳,是的。它能夠比較兩次,因爲sed命令將尾隨空格替換爲0。一旦完成,字符串比較會告訴您是否一次接一個地使用字母數字排序。如果沒有sed命令,則會得到奇怪的結果:3:00:00會在21:00:00之後出現,因爲32之後。

+0

oookk !!那麼我想它正在試圖以「4:23:30」到「04:23:30」之類的特定格式製作時間戳。..yep 1st解決了。第二個腳本的任何想法? – 2014-09-30 07:33:30

+0

@JeevanPatnaik我編輯了我的答案來解釋第二位。 – 2014-09-30 07:40:18

+0

謝謝...知道了! :) – 2014-09-30 07:42:51

1

搜索正則表達式是在該行的開頭兩個空間在替換線路(由^表示)開始時的2位。
替換項是數字0.
-i選項表示「就地」:編輯的結果被寫回源文件(而不是stdout)。

相關問題