/etc/ssl/openssl.cnf文件包含许多名称,值对,形式为“name = value”。它还包含许多其他内容,包括标题,其中行以[和注释开头,其中#作为第一个字符。编写一个命令,列出实际设置的唯一值(记住,名称/值对)(即忽略注释行)。
是的,这是一个家庭作业的问题,但我不知道我在做什么,并希望有人可以帮助或给我一个可行的例子,这样我可以更好地理解?
答案 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 \[]/
匹配的令牌来收集价值的所有部分。