2016-07-05 10 views
0

次の形式のテストファイルがあります。ユーザーがデータベースからロックされたときのusername_dateが含まれています。kshを使用して行から名前と日付を解析し、日付が50日より古い場合は行を削除します。

$ cat lockedusers.txt 
TEST1_21062016   
TEST2_02122015 
TEST3_01032016 
TEST4_01042016 
$ 

私はkshスクリプトを作成しています。この難しいシナリオには、私のレベルのスクリプト作成に直面しています。私は何をしたいのです:

  1. この行の日付の値がより古い50日、
  2. であれば、例えば、アンダースコア文字の前までのラインを読み
  3. 、テキストファイルから行を読みますTEST1を変数
  4. に入力し、この行を削除します。

この変数は、データベースからユーザーを削除するために使用されます。どんな助けもありがとう。

+1

これは、コードの書き込みサービスではありませんが、ここではカップルのヒントがあります:1)変数にご入力ラインを分離するためにIFSを使用します。 2) 'date -d '50日前に '+%Y%m%d'を使用して算術比較を行い、論理を決定します。入力として使用しているファイルから行を削除すると問題が発生する可能性があるので、代わりに残したい行を別のファイルに保存して、完了したら元のファイルを置き換えることができます。 – twalberg

+0

ようこそスタックオーバーフロー。すぐに[バージョン情報]ページをお読みください。何を試しましたか?あなたは直面している問題は何ですか?日付の書式は何ですか(おそらくddmmyyyyですが、yyyymmddを使用する方がよいでしょうが、好ましくは句読点付きです)。あなたは50日間の差をどのように計算するのですか?あなたはどのUnix版を使用していますか?あなたはGNUの 'date'コマンドを利用できますか?あなたはPerlを利用できますか? [Date :: Calc](http://search.cpan.org/perldoc?Date%3A%3ACalc)のようなPerlモジュールをインストールできますか? –

+0

[twalberg](http://stackoverflow.com/users/1253222/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

非常に、ありがとう、あなたの助けてくれてありがとう - この問題の解決方法は、このコードでは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 

と同様に、現在の日付のエポックからの秒数を見つけること。組み込みのシェルexprを使用して、その日付が現在の日付よりも古い50*24*3600秒かどうかを判別します。

次のベストベットはPerlを使用することです。

+0

Kornシェルには、組み込み(浮動小数点)シェル算術があり、 'expr' irrelevant - ' $((算術式)) 'を使用しています。 –

関連する問題