使用 ksh 从一行中解析名称和日期,如果日期早于 50 天,则删除该行

Use ksh to parse a name and a date from a line and remove the line if the date is older than 50 days

我有一个具有以下格式的测试文件,它包含用户被数据库锁定时的 username_date。

$ cat lockedusers.txt
TEST1_21062016          
TEST2_02122015  
TEST3_01032016  
TEST4_01042016
$

我正在编写一个 ksh 脚本,并且面对我的脚本编写水平的这种困难场景。我想做的是:

  1. 从文本文件中读取行,
  2. 如果此行的日期值早于 50 天,
  3. 然后阅读下划线字符之前的行,例如TEST1 变成一个变量,
  4. 然后删除这一行。

该变量将用于从数据库中删除用户。任何帮助将不胜感激。

有一个 dateconv 命令可以将日期转换为自纪元以来的秒数;您可以使用它来确定日期是否比当前日期早 N 秒(五十天的秒数)。但是,dateconv 并非普遍可用。

您将按如下方式使用 dateconv

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

并类似地查找自当前日期纪元以来的秒数;然后,您将使用 shell 内置函数 expr 来确定该日期是否比当前日期早 50*24*3600 秒。

下一个最佳选择是使用 Perl。

大家好,感谢您的帮助 - 这是此问题的解决方案,不包括如何从数据库中删除用户购买它应该很容易为任何人弄清楚,因为此代码将生成 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

感谢我的同事 Derek 来自 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