【问题标题】:Use ksh to parse a name and a date from a line and remove the line if the date is older than 50 days使用 ksh 从行中解析名称和日期,如果日期超过 50 天,则删除该行
【发布时间】:2016-11-07 18:13:30
【问题描述】:

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

$ cat lockedusers.txt
TEST1_21062016          
TEST2_02122015  
TEST3_01032016  
TEST4_01042016
$

我正在编写一个 ksh 脚本,并且在我的脚本编写水平上面临这种困难的情况。我想做的是:

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

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

【问题讨论】:

  • 这不是一个代码编写服务,但这里有一些提示:1)使用 IFS 将您的输入行分隔为变量; 2) 使用date -d '50 days ago' +%Y%m%d 和算术比较来做出你的逻辑决定。从您用作输入的文件中删除一行可能会出现问题,因此,请将您想要保留的行保存到另一个文件中,然后在完成后替换原始文件。
  • 欢迎来到 Stack Overflow。请尽快阅读About 页面。你试过什么?您面临哪些问题?日期的格式是什么(可能是 ddmmyyyy - 但最好使用 yyyymmdd,最好使用标点符号)。您如何计算 50 天的差异?您使用的是哪个 Unix 变体?你有可用的 GNU date 命令吗?你有 Perl 可用吗?能不能安装 Perl 模块,比如Date::Calc
  • 请注意,twalbergcomment 假设存在 GNU date — 并说明了它为何有用。在没有 GNU date 的情况下进行计算要困难得多。

标签: shell unix scripting ksh


【解决方案1】:

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

您将使用dateconv,如下所示:

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

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

下一个最好的选择是使用 Perl。

【讨论】:

  • 请注意,Korn shell 具有内置(浮点)shell 算法,使得 expr 的使用无关 — $(( arithmetic expression ))
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 2015-06-08
    • 1970-01-01
    • 2010-11-06
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多