编写一个命令,列出实际设置的唯一值(记住,名称/值对)(即忽略注释行)

时间:2016-10-03 17:53:03

标签: linux unix

/etc/ssl/openssl.cnf文件包含许多名称,值对,形式为“name = value”。它还包含许多其他内容,包括标题,其中行以[和注释开头,其中#作为第一个字符。编写一个命令,列出实际设置的唯一值(记住,名称/值对)(即忽略注释行)。

是的,这是一个家庭作业的问题,但我不知道我在做什么,并希望有人可以帮助或给我一个可行的例子,这样我可以更好地理解?

1 个答案:

答案 0 :(得分:0)

查看awk以查找需要您逐行排序,解析线路以及决定输出内容的问题。例如:

awk -F"[= \t]+" '$0 ~ /^[^#\r\n\t \[]/ {print $1, $2}' /etc/ssl/openssl.cnf

awk逐行遍历文件。我们首先指定一个分隔符,使用-F标志将每一行拆分为标记。在这里,我们使用=或制表符\t将行分成多个令牌,连续出现一次或多次(-F"[= \t]+")。

然后在awk脚本本身,我们有块,我们对遇到的每一行采取行动。块在括号{ this is a block }之间发生。我们可以使用美元符号和从1开始的数字来引用每个拆分令牌。$1表示遇到第一个令牌。在这里,我们在每一行上执行的块是{print $1, $2},其中写着“打印出该行遇到的第一个和第二个令牌”,这是等号前的内容和后面的内容。

此外,可以通过在其之前放置返回true或false的条件语句来使块成为条件。这里我们在特殊标记$0上使用正则表达式条件,这意味着整行的内容:$0 ~ /^[^#\r\n\t \[]/说:“如果该行不以#开头,则回车,行Feed,制表符,空格或[字符,然后执行此行的块。

您可以使用特殊OFS块中的BEGIN{}变量中内置的awk指定要分隔键/值对的字符,该块在文件处理开始之前执行一次:< / p>

 awk -F"[= \t]+" 'BEGIN{OFS="|"} $0 ~ /^[^#\r\n\t \[]/ {print $1, $2}' /etc/ssl/openssl.cnf

通过它,您将在配置文件中的键/值对之间获得管道分隔符。

这里有一点需要注意,其中包含分隔符的键/值对的值将被截断,因此可能需要awk脚本中的for loop来迭代您的标记,从$2开始直到你点击了一个与/^[^#\r\n\t \[]/匹配的令牌来收集价值的所有部分。