Bash,用字符串中的字符切词

时间:2017-11-14 22:04:59

标签: bash shell awk sed grep

我有一个字符串:

  

登录:squid.log.2017.11.13

我需要删除squid.log.以便我看到:

  

日志:2017.11.13

我尝试cut

echo "Log for: squid.log.2017.11.13" | cut -d'.' -f3-5

但我最终得到了:

  

2017年11月13日

如何获得我想要的结果?

4 个答案:

答案 0 :(得分:2)

您可以使用sed剪切不需要的部分:

echo "Log for: squid.log.2017.11.13" | sed 's/squid\.log\.//'

答案 1 :(得分:1)

使用sed 删除 所需的部分

echo "Log for: squid.log.2017.11.13" | sed 's/squid\.log\.//'

答案 2 :(得分:1)

awk救援!打破单调的非标准方法......

将要删除的文本定义为字段分隔符,并解析并打印输入行。

$ echo Log for: squid.log.2017.11.13 | awk -F' squid\\.log\\.' '{$1=$1}1'

Log for: 2017.11.13

答案 3 :(得分:0)

此解决方案比之前提供的解决方案更具可重用性:

awk '/^Log/{ split($3,x,"."); print $1" "$2" "x[length(x)-2]"."x[length(x)-1]"."x[length(x)] };'

这将查找以Log开头的所有行,然后抓取包含squid.log.2017.11.13的第3列,并利用split内置函数将字符串拆分为数组{{ 1}}使用x作为分隔符。一旦我们得到了数组.,我们知道最后3个值将始终是日期,无论字符串的其余部分如何,这都会起作用(即使x不同) - 我们可以使用squid.log内置来确保我们只获得最后三个元素。

然后我们只打印重新格式化的字符串length - 将print $1" "$2" "x[length(x)-2]"."x[length(x)-1]"."x[length(x)]重新插入适当的位置,因为它们被用作.分隔符而被剥离。

输出: split