如何从时间戳中删除第一个冒号':'?


10

我是编程新手!!

任何人都可以帮助删除:时间戳记中的第一个位置::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:


14

要切断第一个字符,您还可以使用cut -c

$ echo ":29.06.2019 23:03:17" | cut -c 2-
29.06.2019 23:03:17

11

使用

cut -d: -f2-

代替

cut -d: -f2

从第二个字段到行尾获取任何内容:

TDS="$(grep 'Logfile started' process.log |  awk '{print $3,$4}' | cut -d: -f2-)"
echo "$TDS"

8

awk是一个很酷的工具,您可以使用它解决非常复杂的任务。但是对于您的问题,我宁愿坚持bash的基本功能。

为了方便删除,我将执行以下操作:

zehe="Logfile started :29.06.2019 23:03:17"
echo "${zehe#*:}"

这将打印:

29.06.2019 23:03:17

当我处于您的位置并开始学习编程和bash时,我从该手册中学到了很多东西:

ABS-高级Bash脚本指南

这里可以找到更多示例和有关您的问题的有趣信息,查找“子字符串删除”。


3
+1这个!由于该问题被标记为“ bash”,因此应该认为它更喜欢bash的强大的(尽管通常很晦涩)操纵字符串的功能,该功能比加载外部工具快得多。
rexkogitans

2
@rexkogitans,因为我们已经在调用grep或awk来解析文件,所以bash不会更快。实际上,无论何时需要解析文件,bash都会很慢。所有的shell都较慢,bash的速度比大多数要慢。也就是说,shell的字符串操作功能确实通常是最好的方法,但前提是您已经将输入作为变量。

8

这是一个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!我今天学到的东西。
弗洛里斯

6

由于您已经在中进行了处理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的字符串替换正则表达式的所有匹配项。在这里,我们将第三字段()中的第一个(表示“开始”)替换为空。REPLACEMENTTARGET:^$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"

0

另一个bash解决方案:

$ echo "Logfile started :29.06.2019 23:03:17" | xargs bash -c 'echo "${2#*:} $3"'
29.06.2019 23:03:17
  • 这使用管道而不是中间变量分配。
  • 该命令xargsstdin(标准输入)转换为bash命令的位置参数。
  • 替换echotail -n1 /path/to/reportfile.txt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.