gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 05:22:17 25 4
gpt4 key购买 nike

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

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

最佳答案

查看awk,了解需要您逐行分析、解析行并决定输出内容的问题。例如:

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

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

然后在 awk 脚本本身中,我们有一些 block ,我们对遇到的每一行采取操作。 block 出现在波浪括号 { 这是一个 block } 之间。我们可以使用美元符号和从 1 开始的数字来引用每个分离的 token 。$1 表示遇到的第一个 token 。这里,我们在每行上执行的 block 是 {print $1, $2} ,它表示“打印出该行遇到的第一个和第二个标记”,即等号之前的内容和紧随其后的内容。

此外,通过在返回 true 或 false 的条件语句之前放置一个 block ,可以将其设置为有条件的。这里我们在特殊标记 $0 上使用正则表达式条件,这表示整行的内容: $0 ~/^[^#\r\n\t\[]/ 这表示:“如果该行不是以 #、回车符、换行符、制表符、空格或 [ 字符开头,则执行该行的 block 。

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

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

这样,您将在配置文件中的键/值对之间得到一个管道分隔符。

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

关于linux - 编写一个命令,列出实际设置的唯一值(记住,名称/值对)(即忽略注释行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39837570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com