我是编程新手!!
任何人都可以帮助删除:
时间戳记中的第一个位置::29.06.2019 23:03:17
目前,我正在尝试使用awk / cut命令执行此操作,如下所示:
TDS="$(grep 'Logfile started' process.log | awk '{print $3,$4}' | cut -d: -f2)"
echo "$TDS"
29.06.2019 23
输出不是我想要的!我想将其打印为29.06.2019 23:03:17
。
我是编程新手!!
任何人都可以帮助删除:
时间戳记中的第一个位置::29.06.2019 23:03:17
目前,我正在尝试使用awk / cut命令执行此操作,如下所示:
TDS="$(grep 'Logfile started' process.log | awk '{print $3,$4}' | cut -d: -f2)"
echo "$TDS"
29.06.2019 23
输出不是我想要的!我想将其打印为29.06.2019 23:03:17
。
Answers:
awk
是一个很酷的工具,您可以使用它解决非常复杂的任务。但是对于您的问题,我宁愿坚持bash的基本功能。
为了方便删除,我将执行以下操作:
zehe="Logfile started :29.06.2019 23:03:17"
echo "${zehe#*:}"
这将打印:
29.06.2019 23:03:17
当我处于您的位置并开始学习编程和bash时,我从该手册中学到了很多东西:
在这里可以找到更多示例和有关您的问题的有趣信息,查找“子字符串删除”。
这是一个sed
解决方案:
$ echo ':29.06.2019 23:03:17' | sed 's/^://'
29.06.2019 23:03:17
该命令sed 's/^://'
正在执行的操作是用空字符串替换每行开头s
的冒号字符。:
^
//
这是一个棘手的awk
解决方案,其中我们将字段分隔符更改为^:
,如上所述,然后输出(每行的)第二个字段:
$ echo ':29.06.2019 23:03:17' | awk -F'^:' '{print $2}'
29.06.2019 23:03:17
该任务也可以通过grep
(说明)来完成,这可能是处理大量数据的最快解决方案:
$ echo 'Logfile started :29.06.2019 23:03:17' | grep -Po '^Logfile started :\K.*'
29.06.2019 23:03:17
或通过以下命令直接处理文件,其中^
已删除限制:
grep -Po 'Logfile started :\K.*' process.log
sed
捕获组也可以实现上述目标()->\1
:
sed -nr 's/^.*Logfile started :(.*)$/\1/p' process.log
该表达式^.*<something>.*$
将匹配整行,其中包含<something>
。该命令s/old/new/
将用第一个捕获组的内容替换此行(括号中的表达式可能更具体)。该选项-r
启用扩展的正则表达式。该选项-n
将禁止正常输出,sed
最后该命令p
将打印匹配项。
awk
可以使用带有特殊含义的字符的多字符FS!我今天学到的东西。
由于您已经在中进行了处理awk
,因此您也可以直接完成整个操作:
$ echo "foo bar :29.06.2019 23:03:17" | awk '{sub(/^:/,"",$3); print $3,$4}'
29.06.2019 23:03:17
该sub
命令的一般格式为sub(/REGEX/, REPLACEMENT, TARGET)
,并将用输入string中REGEX
的字符串替换正则表达式的所有匹配项。在这里,我们将第三字段()中的第一个(表示“开始”)替换为空。REPLACEMENT
TARGET
:
^
$3
当然,如果您在awk中进行此操作,则最好在awk中进行所有操作,并通过一个操作即可完成整个操作:
$ echo "Logfile started :29.06.2019 23:03:17" |
awk '/Logfile started/{sub(/^:/,"",$3); print $3,$4}'
29.06.2019 23:03:17
或者,在您的情况下:
TDS="$(awk '/Logfile started/{sub(/^:/,"",$3); print $3,$4}' process.log)"
echo "$TDS"
另一个bash解决方案:
$ echo "Logfile started :29.06.2019 23:03:17" | xargs bash -c 'echo "${2#*:} $3"'
29.06.2019 23:03:17
xargs
将stdin
(标准输入)转换为bash
命令的位置参数。echo
为tail -n1 /path/to/reportfile.txt
。