Shell Linux:grep具有NULL字符的精确句子

时间:2015-01-04 19:20:11

标签: linux shell null grep

我有一个像

这样的文件
key\0value\n
akey\0value\n
key2\0value\n

我必须创建一个以单词为参数的脚本。我必须返回每个具有与参数完全相同的键的行。

我试过

grep -aF "$key\x0"

但是grep似乎不理解\ x0(\ 0相同的结果)。此外,我必须检查该行是否以" $ key \ 0"

开头

我只能使用sed grep和tr以及其他没有加工命令

2 个答案:

答案 0 :(得分:1)

要考虑\ 0,请尝试:

  grep -Pa "^key\x0"

它对我有用。

答案 1 :(得分:1)

使用sed

sed将有效:

$ sed -n '/^key1\x00/p' file
key1value

使用\x00表示十六进制字符是sed的GNU扩展。由于此问题已标记为linux,因此不存在问题。

由于空字符显示效果不佳,可能(或可能不想)用这样的方式改进显示:

$ sed -n 's/^\(akey\)\x00/\1-->/p' file
akey-->value

sed与包含特殊字符的键

一起使用

如果密钥本身可以包含sed或shell活动字符,那么我们必须首先对它们进行转义,然后对输入文件运行sed

#!/bin/bash
printf -v script '/^%s\\x00/p' "$(sed 's:[]\[^$.*/]:\\&:g' <<<"$1")"
sed -n "$script" file

要使用此脚本,只需将密钥作为命令行的第一个参数提供,当然用单引号括起来,以防止shell处理。

要了解它的工作原理,让我们依次看一下这些部分:

  • sed 's:[]\[^$.*/]:\\&:g' <<<"$1"

    这会在所有sed-active字符前放置反斜杠。

  • printf -v script '/^%s\\x00/p' "$(sed 's:[]\[^$.*/]:\\&:g' <<<"$1")"

    这将使用转义密钥创建sed命令,并将其存储在shell变量script中。

  • sed -n "$script" file

    使用shell变量sed作为script命令运行sed

使用awk

问题表明awk不是可接受的工具。但是,为了完整起见,这是一个awk解决方案:

$ awk -F'\x00' -v k=key1 '$1 == k' file
key1value

说明:

  • -F'\x00'

    awk将输入划分为记录(行)并将记录划分为字段。在这里,我们将字段分隔符设置为空字符。因此,第一个字段(表示为$1)是关键字。

  • -v k=key1

    这会创建一个名为awk的{​​{1}}变量,并将其设置为我们要查找的密钥。

  • k

    此语句查找第一个字段与指定键匹配的记录(行)。如果找到匹配项,则会打印该行。