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)
这是一个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 时,我从这本手册中学到了很多东西:
可以在此处找到有关您的问题的更多示例和有趣信息,请查找“子字符串删除”。
既然你已经在 中处理了这个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)
| 归档时间: |
|
| 查看次数: |
4399 次 |
| 最近记录: |