【问题标题】:How to use IFS with multiple delimiters?如何使用带有多个分隔符的 IFS?
【发布时间】:2021-06-11 09:33:12
【问题描述】:

日志文件中的数据是这样的

username - yyyy-mm-dd, HH:MM:SS

现在如何分开用户名、日期和时间?

我试过了。

while IFS=" - |, " read G1 G2 G3

但这考虑了日期之间的连字符..有什么想法吗?

编辑: 我居然找到了一个方法.....

我用过

while IFS="-""," read G1 G2 G3 G4 

G1 是用户名,G2 是 - G3 是日期,G4 是时间..

我不明白这是如何工作的……但它确实有效

谢谢

【问题讨论】:

  • 对不起???我是新手
  • 您正在尝试将它与多个 multi-character 分隔符一起使用。那是行不通的。在这种特殊情况下,您可以在不更改 IFS 的情况下将它们读入 4 个变量,丢弃第二个,然后从第三个中删除逗号。
  • 您认为对您有用的方法根本不是解决方案,IFS 仅拆分单个字符。

标签: linux bash terminal


【解决方案1】:

你可以在bash试试这个脚本:

while IFS= read -r && read G1 G2 G3 <<< "${REPLY//[,-]/}"; do
   echo "[$G1][$G2][$G3]"
done < file.log

输出:

[username][yyyymmdd][HH:MM:SS]

这里我们首先读取内部REPLY 变量中的完整行,然后我们使用另一个read 在清理$REPLY 后通过预先删除-, 来获取3 个变量中的值。

【讨论】:

  • @Jagan:想知道这是否适合你
【解决方案2】:

如何使用带多个分隔符的 IFS?

可以使用带有多个单个字符分隔符的IFS。 IFS 中集合中的任何字符都被视为分隔符。 IFS=" - |, " 等于 IFS=" -|," - 忽略重复的字符。

不能将 IFS 拆分与任何多字符分隔符一起使用。

有什么想法吗?

使用其他工具并自己进行拆分。您可以使用 bash [[ =~ 匹配或在 sed 中匹配该行与正则表达式,或使用 awk 来解析该行或使用其他工具。

【讨论】:

    【解决方案3】:

    另一种方法是使用虚拟变量来保存破折号-,并使用Parameter Expansion 删除结尾的逗号,,例如"${date%,}"

    while read -r username _ date time; do
       echo "$username" "${date%,}" "$time"
    done < log.txt
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-25
      • 1970-01-01
      • 2019-11-03
      • 1970-01-01
      • 2014-10-16
      • 2018-05-26
      相关资源
      最近更新 更多