使用 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 脚本,并且面对我的脚本编写水平的这种困难场景。我想做的是:
- 从文本文件中读取行,
- 如果此行的日期值早于 50 天,
- 然后阅读下划线字符之前的行,例如TEST1 变成一个变量,
- 然后删除这一行。
该变量将用于从数据库中删除用户。任何帮助将不胜感激。
有一个 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
我有一个具有以下格式的测试文件,它包含用户被数据库锁定时的 username_date。
$ cat lockedusers.txt
TEST1_21062016
TEST2_02122015
TEST3_01032016
TEST4_01042016
$
我正在编写一个 ksh 脚本,并且面对我的脚本编写水平的这种困难场景。我想做的是:
- 从文本文件中读取行,
- 如果此行的日期值早于 50 天,
- 然后阅读下划线字符之前的行,例如TEST1 变成一个变量,
- 然后删除这一行。
该变量将用于从数据库中删除用户。任何帮助将不胜感激。
有一个 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