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

Man*_*mar 10 command-line bash awk cut-command

我是编程新手!!

任何人都可以帮助删除:时间戳中的第一个位置::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
Run Code Online (Sandbox Code Playgroud)

输出不是我想要的!我想将其打印为29.06.2019 23:03:17.

pLu*_*umo 14

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

$ echo ":29.06.2019 23:03:17" | cut -c 2-
29.06.2019 23:03:17
Run Code Online (Sandbox Code Playgroud)


Flo*_*sch 11

cut -d: -f2-
Run Code Online (Sandbox Code Playgroud)

代替

cut -d: -f2
Run Code Online (Sandbox Code Playgroud)

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

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


pa4*_*080 8

这是一个sed解决方案:

$ echo ':29.06.2019 23:03:17' | sed 's/^://'
29.06.2019 23:03:17
Run Code Online (Sandbox Code Playgroud)

该命令sed 's/^://'所做的是用空字符串替换每行开头s的冒号字符。:^//

这是一个棘手的awk解决方案,我们将字段分隔符更改为^:,如上所述,并输出(每行的)第二个字段:

$ echo ':29.06.2019 23:03:17' | awk -F'^:' '{print $2}'
29.06.2019 23:03:17
Run Code Online (Sandbox Code Playgroud)

该任务也可以通过grep解释)完成,这可能是大量数据的最快解决方案:

$ echo 'Logfile started :29.06.2019 23:03:17' | grep -Po '^Logfile started :\K.*'
29.06.2019 23:03:17
Run Code Online (Sandbox Code Playgroud)

或者直接通过下面的命令处理文件,这里的限制^去掉:

grep -Po 'Logfile started :\K.*' process.log
Run Code Online (Sandbox Code Playgroud)

以上也可以通过sed和捕获组来实现()->\1

sed -nr 's/^.*Logfile started :(.*)$/\1/p' process.log
Run Code Online (Sandbox Code Playgroud)

表达式^.*<something>.*$将匹配整行,其中包含<something>. 该命令s/old/new/将用第一个捕获组的内容替换这一行(括号中的表达式可以更具体)。该选项-r启用扩展正则表达式。该选项-n将抑制 的正常输出,sed最后该命令p将打印匹配项。


小智 8

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

为了这个简单的substing去除,我会做以下事情:

zehe="Logfile started :29.06.2019 23:03:17"
echo "${zehe#*:}"
Run Code Online (Sandbox Code Playgroud)

这将打印:

29.06.2019 23:03:17
Run Code Online (Sandbox Code Playgroud)

当我在你的位置上开始学习编程和 bash 时,我从这本手册中学到了很多东西:

ABS - 高级 Bash 脚本指南

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

  • +1 这个!由于问题被标记为“bash”,因此应该考虑更喜欢 bash 的强大(尽管通常很模糊)操作字符串的能力,这些能力比加载外部工具快得多。 (3认同)
  • @rexkogitans 因为我们已经在调用 grep 或 awk 来解析文件,所以 bash 不会更快。事实上,每当你需要解析一个文件时,bash 都会很慢。所有 shell 都很慢,bash 比大多数都慢。也就是说,shell 的字符串操作功能确实通常是最好的方法,但前提是您已经将输入作为变量。 (2认同)

ter*_*don 6

既然你已经在 中处理了这个awk,你也可以直接做整个事情:

$ echo "foo bar :29.06.2019 23:03:17" |  awk '{sub(/^:/,"",$3); print $3,$4}' 
29.06.2019 23:03:17
Run Code Online (Sandbox Code Playgroud)

sub命令的一般格式是sub(/REGEX/, REPLACEMENT, TARGET)并将用输入字符串中REGEX的字符串替换正则表达式的所有匹配项。在这里,我们将第3 个字段 ( ) 中的第一个(表示“开始”)替换为空。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
Run Code Online (Sandbox Code Playgroud)

或者,就您而言:

TDS="$(awk '/Logfile started/{sub(/^:/,"",$3); print $3,$4}' process.log)"
echo "$TDS"
Run Code Online (Sandbox Code Playgroud)