【问题标题】:Include # (commented lines) while using awk使用 awk 时包括 #(注释行)
【发布时间】:2015-05-12 20:28:03
【问题描述】:

所以我有一个内容为 abc 的文件:

 Post=76.34.34
 Pull=56.76.34
 # In case you're not a regular user then post 76.34.36/37,
 # change the value to (1.1.1,)
 Number=506442

我需要使用每一行从这里创建一个 awk 命令,以便在其他地方进行比较。

所以我正在使用

awk '/Post=76.34.34/ && /Pull=56.76.34/ && /# In case you're not a regular user then post 76.34.36/37,/ && /# change the value to (1.1.1,)/ && /Number=506442/' /File/ToBe/Compared

这里的问题是因为 #.对于像#、'(如果是you're)这样的字符,一旦进行,如何处理?需要使用这个 awk 命令来比较这些行,然后在文件中进行匹配。

在这种情况下需要知道如何包含 #, '。

【问题讨论】:

  • 那些测试不可能全部返回真。他们只测试一条线。你想测试连续的线吗?为什么你认为# 在这里是个问题?你能更清楚地解释你到底想要做什么吗?
  • 所以基本上这个文件有一定的配置,并且在某些操作之后数据有时会改变。我在 awk 语句中对这些行进行了硬编码,如果数据确实发生了变化,那么我只需将原始数据附加回这个文件。所以awk '/Post.............../File/Path if [ $? != 0 ] truncate -s 0 /File/Path echo "Original Data"
  • 为什么还要检查呢?为什么不总是使用原始数据重新创建? (话虽如此,为什么它首先会发生变化?)

标签: regex bash shell awk scripting


【解决方案1】:

# 在模式或字符串中不应引起任何问题:

$ echo "# hello" | awk '/^#/ { print $2 }'
hello

单引号有点麻烦,因为我们通常用单引号将 awk 内联命令括起来。不同的人有不同的处理方式。

使用\x27

$ echo "you're welcome" | awk '/you\x27re/ { print $2 }'
welcome

将您的 awk 脚本放入文件中

$ cat foo.awk
/you're/ { print $2 }

$ echo "you're welcome" | awk -f foo.awk
welcome

用双引号将内联脚本括起来并根据需要转义(我会将此方法仅保存在最琐碎的情况下,或者永远不会保存)。

$ echo "you're welcome" | awk "/you're/ { print \$2 }"
welcome

【讨论】:

    猜你喜欢
    • 2014-01-13
    • 2012-07-01
    • 2021-12-11
    • 2012-07-28
    • 2013-06-27
    • 2013-10-07
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    相关资源
    最近更新 更多