2016-07-05 51 views
0

我有一個測試文件,格式如下,它包含用戶從數據庫鎖定時的username_date。使用ksh解析一行中的名稱和日期,並在日期早於50天時刪除該行

$ cat lockedusers.txt 
TEST1_21062016   
TEST2_02122015 
TEST3_01032016 
TEST4_01042016 
$ 

我正在寫一個ksh腳本,面對我的腳本級別的這個難題。我想這樣做的是:

  1. 閱讀從文本文件中的行,
  2. 如果該行的日期值超過50天以上,
  3. 然後讀取一行直至下劃線之前,例如TEST1變成一個變量,
  4. 然後刪除這一行。

該變量將用於從數據庫中刪除用戶。任何幫助,將不勝感激。

+1

這不是一個代碼編寫的服務,但這裏的一對夫婦的提示:1)使用IFS您輸入線分成變量; 2)使用'date -d '50天前'+%Y%m%d'和一個算術比較來做出邏輯決定。從您用作輸入的文件中刪除一行可能會產生問題,因此請將您希望保留的行保存到另一個文件,然後在完成後可能會替換原始文件。 – twalberg

+0

歡迎使用堆棧溢出。請儘快閱讀[關於]頁面。你有什麼嘗試?你面臨的問題是什麼?日期的格式是什麼(可能是ddmmyyyy - 但最好使用yyyymmdd,最好是標點符號)。你如何計算50天的差異?你使用哪種Unix變體?你有GNU'date'命令嗎?你有Perl嗎?你可以安裝Perl模塊,比如[Date :: Calc](http://search.cpan.org/perldoc?Date%3A%3ACalc)嗎? –

+0

請注意,[twalberg]的[評論](http://stackoverflow.com/questions/38211373/ksh-parse-line-before-underscroe-character -into-a-variable-then-remove-this-line#comment63847531_38211373)假定存在GNU'date' - 並說明它爲什麼有用。做沒有GNU'date'的計算是相當困難的。 –

回答

0

非常感謝您的幫助 - 此問題的解決方案不包括如何從數據庫中刪除用戶buyt應該很容易找出任何人,因爲此代碼會生成超過50天的用戶列表。

#!/bin/ksh 
echo 
cat test | 
while IFS="_ " read LUSER LDATE 
do 
     Day=`echo $LDATE | cut -c1,2` 
     Mon=`echo $LDATE | cut -c3,4` 
     Year=`echo $LDATE | cut -c5-8` 
     Date=`echo $Mon/$Day/$Year` 
     if [[ $(($(date +%s) - $(date +%s -d${Date}))) -ge 4320000 ]] ; then 
     #echo "$LUSER, $LDATE"i 
     echo "$LUSER" >> userRemovalList 
     grep -v "$LUSER" test > temp && mv temp test 
     fi 
done 
chmod 755 userRemovalList 

感謝我的同事德里克從UNIX幫手門戶另一個助手 http://www.unix.com/shell-programming-and-scripting/267002-ksh-read-line-parse-characters-into-variable-remove-line-if-date-older-than-50-days-2.html#post302977045

0

有一個dateconv命令可將日期轉換爲自紀元以來的秒數;您可以使用它來確定某個日期是否比N日期(50天內的秒數)早於當前日期。但是,dateconv並不普遍。

你會使用dateconv如下:

dateconv -i %Y%m%d -f %s 

,同樣發現,因爲當前日期的劃時代的秒數;您將使用shell內建的expr來確定該日期是否比當前日期早50*24*3600秒。

下一個最好的選擇是使用Perl。

+0

請注意,Korn shell具有內置(浮點)shell算術,使得'expr'無關 - '$((算術表達式))'。 –