在linux bash脚本中的awk中执行日期实用程序

在linux bash脚本中的awk中执行日期实用程序,linux,bash,shell,date,awk,Linux,Bash,Shell,Date,Awk,我正在尝试使用awk格式化文件中的一些文本 要求将表示历元时间的冒号分隔文件(:)的第3个字段替换为表示人类可读时间的格式化字符串,格式如下: 年月日 下面是一个示例文件: abc:$3$wHe$JKAP1Ry.CAcEGhD0J7SGVl.AMg.0:1427135400:0:120:7:30:: rst:$6$3WWbfvblr6FF92R5/n3mLdlSkARgfRm1:1427293800:0:40:7:30:: xyz:$1$xuTkkle203F$df.ixcn/mcuFIO90l

我正在尝试使用awk格式化文件中的一些文本

要求将表示历元时间的冒号分隔文件(:)的第3个字段替换为表示人类可读时间的格式化字符串,格式如下: 年月日

下面是一个示例文件:

abc:$3$wHe$JKAP1Ry.CAcEGhD0J7SGVl.AMg.0:1427135400:0:120:7:30::
rst:$6$3WWbfvblr6FF92R5/n3mLdlSkARgfRm1:1427293800:0:40:7:30::
xyz:$1$xuTkkle203F$df.ixcn/mcuFIO90lndn:1420478400:0:90:7:30::
def:$4$vid2003mDEOF$dc2.Rkdlkfdiw8/cib6:1389547200:0:120:7:30::
ab:*$5P1wHeEG$JKA2ya.ikol30.de/ldiv.230:1449771300:0:120:7:30::
xy:$1k3lc930vs.lskdie/sldiemDIIsdk193n:1429995693:0:50:7:30::
xyy:*$tkwsMt972w.Csrl5jr.23nsoijsleqJK:1429995889:0:120:7:30::
通过使用date将第3个字段中的一个值复制并粘贴到a命令中,我能够创建所需的结果:

date -d @1427135400 +"%d/%m/%Y"
23/03/2015
这是我试图在脚本中执行的awk命令,我一直在四处调试脚本,希望它能正常工作,但运气不好。 请注意,$userFound已经存储了上面列出的文件中的一行:

  echo $userFound | awk -F':' '{  
                                                    if ( $2 ~ /^\*/ ) {$2="L"}              \
                                                    if ($2 ~ /^[^*]/) {$2="P"}              \
                                                    cmd="date -d @"$3" +\"%d/%m/%Y\""       \
                                                    cmd | getline time                      \
                                                    close(cmd)                              \
                                            }                                               \
                                            END {                                           \
                                            print $1":"$2":"time":"$4":"$5":"$6":"$7":"$8":"$9      \
                                            }'
运行当前脚本,我得到以下输出:

awk: cmd. line:5: (FILENAME=- FNR=1) fatal: expression for `|' redirection has null string value

不要像您试图使用的那样使用
date
命令

使用
awk
函数:
strftime(“%d/%m/%Y”,$3)


更多信息

不要像您试图使用的那样使用
date
命令

使用
awk
函数:
strftime(“%d/%m/%Y”,$3)


更多信息

如果您确实需要使用
日期
(因为您没有GNU awk),您的脚本只需进行一些更改,即print语句不应位于结束块中

BEGIN {
    FS = ":"
    OFS = ":"
}
{
    if ( $2 ~ /^\*/ ) {$2="L"}      
    if ($2 ~ /^[^*]/) {$2="P"}
    cmd="date -d @" $3 " +\"%d/%m/%Y\""
    cmd | getline time
    close(cmd)
    print $1, $2, time, $4, $5, $6, $7, $8, $9
}
如果将此脚本放在名为a.awk的文件中,则可以执行以下操作

awk -f a.awk foo.txt
如果foo.txt如下所示:

abc:$3$wHe$JKAP1Ry.CAcEGhD0J7SGVl.AMg.0:1427135400:0:120:7:30::
rst:$6$3WWbfvblr6FF92R5/n3mLdlSkARgfRm1:1427293800:0:40:7:30::
xyz:$1$xuTkkle203F$df.ixcn/mcuFIO90lndn:1420478400:0:90:7:30::
def:$4$vid2003mDEOF$dc2.Rkdlkfdiw8/cib6:1389547200:0:120:7:30::
ab:*$5P1wHeEG$JKA2ya.ikol30.de/ldiv.230:1449771300:0:120:7:30::
xy:$1k3lc930vs.lskdie/sldiemDIIsdk193n:1429995693:0:50:7:30::
xyy:*$tkwsMt972w.Csrl5jr.23nsoijsleqJK:1429995889:0:120:7:30::
那么这就是输出:

abc:P:23/03/2015:0:120:7:30::
rst:P:25/03/2015:0:40:7:30::
xyz:P:05/01/2015:0:90:7:30::
def:P:12/01/2014:0:120:7:30::
ab:P:10/12/2015:0:120:7:30::
xy:P:25/04/2015:0:50:7:30::
xyy:P:25/04/2015:0:120:7:30::

如果您真的需要使用
日期
(因为您没有GNU awk),那么您的脚本需要做一些更改,即print语句不应该在END块中

BEGIN {
    FS = ":"
    OFS = ":"
}
{
    if ( $2 ~ /^\*/ ) {$2="L"}      
    if ($2 ~ /^[^*]/) {$2="P"}
    cmd="date -d @" $3 " +\"%d/%m/%Y\""
    cmd | getline time
    close(cmd)
    print $1, $2, time, $4, $5, $6, $7, $8, $9
}
如果将此脚本放在名为a.awk的文件中,则可以执行以下操作

awk -f a.awk foo.txt
如果foo.txt如下所示:

abc:$3$wHe$JKAP1Ry.CAcEGhD0J7SGVl.AMg.0:1427135400:0:120:7:30::
rst:$6$3WWbfvblr6FF92R5/n3mLdlSkARgfRm1:1427293800:0:40:7:30::
xyz:$1$xuTkkle203F$df.ixcn/mcuFIO90lndn:1420478400:0:90:7:30::
def:$4$vid2003mDEOF$dc2.Rkdlkfdiw8/cib6:1389547200:0:120:7:30::
ab:*$5P1wHeEG$JKA2ya.ikol30.de/ldiv.230:1449771300:0:120:7:30::
xy:$1k3lc930vs.lskdie/sldiemDIIsdk193n:1429995693:0:50:7:30::
xyy:*$tkwsMt972w.Csrl5jr.23nsoijsleqJK:1429995889:0:120:7:30::
那么这就是输出:

abc:P:23/03/2015:0:120:7:30::
rst:P:25/03/2015:0:40:7:30::
xyz:P:05/01/2015:0:90:7:30::
def:P:12/01/2014:0:120:7:30::
ab:P:10/12/2015:0:120:7:30::
xy:P:25/04/2015:0:50:7:30::
xyy:P:25/04/2015:0:120:7:30::

请特别注意哪个
awk
s支持该扩展-follow inshsane的link.gawk可以做到这一点。current也能做到这一点。它不在POSIX中。请特别注意哪个
awk
s支持该扩展-follow inshsane的link.gawk会这样做。current也能做到这一点。它不在POSIX中。您的脚本没有
(FILENAME=-FNR=1)
部分,请发布整个内容。脚本接收来自管道的输入,所有awk代码都在那里。下面的帖子(标记为答案)解决了这个问题。谢谢你的帮助!我已经发布了你的脚本,做了一些修改,我得到了我认为正确的输出。去掉所有行尾的反斜杠。其中一半不是必需的,另一半正在破坏您的代码。您的脚本没有
(FILENAME=-FNR=1)
部分,请发布整个内容。脚本接收来自管道的输入,所有awk代码都在那里。下面的帖子(标记为答案)解决了这个问题。谢谢你的帮助!我已经发布了你的脚本,做了一些修改,我得到了我认为正确的输出。去掉所有行尾的反斜杠。其中一半是不必要的,另一半正在破坏您的代码。