【问题标题】:Parse a text file for certain string with prefix "Product Name:"解析带有前缀“产品名称:”的特定字符串的文本文件
【发布时间】:2015-02-10 19:06:15
【问题描述】:

大家好,我有一个脚本创建的文本文件(特别是 dmidecode > dmidecode.txt),我希望能够获取“产品名称:”的内容,因此在本例中为“HP t5740e 瘦客户端”,但它其他机器类型会略有不同。我可以使用sed 数到第 44 行,然后将其切分,直到得到我想要的,但我希望它比这更有活力。

文本文件:

41  Handle 0x0001, DMI type 1, 27 bytes
42  System Information
43      Manufacturer: Hewlett-Packard
44      Product Name: HP t5740e Thin Client
45      Version:   
46      Serial Number: CNW1160BZ7
47      UUID: A0B86400-6BBD-11E0-8325-92EEE331A344
48      Wake-up Type: Power Switch
49      SKU Number: XL424AA#ABA
50      Family: 103C_53302C

我的代码似乎不起作用:

sed -c -i "s/\($TARGET_KEY *Product Name :*\).*/\1$REPLACEMENT_VALUE/" dmidecode.txt

我觉得我的正则表达式已经过时了(可能是因为我最初看到的例子玷污了我的“愿景”)

非常感谢任何帮助! 另外,有人知道我可以查看任何好的正则表达式引用吗?

更新: 好吧,我可以在这上面多花点时间,找到一些更好的例子,并从我的研究中得到这个:

grep -e "Product Name: HP" -e "Product Name: hp" dmidecode.txt | awk '{print}'

当我添加 '{print $NF}' 时,它只打印最后一个单词,有没有办法修改 print 以包含搜索字符串之后的所有内容而不是整行本身?

另外,我应该从一开始就注意到这一点,但我需要将输出放入变量中。

【问题讨论】:

  • 您显示的代码似乎想用其他东西替换名称,而不是隔离名称。你真正想要哪个?
  • 我只是想“找到”代码并将其实际放入变量中。我对 bash 还很陌生,但在 awk、sed 和 grep 方面我完全是个处女,我不理解搜索字符串和人民代码中的所有那些 "\/. 等字符...:S
  • 感谢大家的帮助/建议!

标签: bash sed grep


【解决方案1】:

你甚至不需要 sed

grep "Product Name" input.txt | cut -f2 -d ":"

解释

grep "Product Name" 只给我包含“产品名称”的行

cut -f2 -d ":" 使用“:”作为分隔符拆分这些行并返回第二个字段

【讨论】:

  • 你不需要猫。只需 grep “产品名称” input.txt | cust -f2 -d:
  • @Shin,谢谢,你是对的,没有猫更简单。我只是习惯了我使用这些工具的方式:我总是让它们从标准输入中读取,而不是给它们一个实际的文件作为参数。
  • 哇,我把这个方法弄得太难了!谢谢你们,现在我只需要将输出放入一个变量并完成!
  • 这个比sed有什么优势?使用 sed,您将拥有一个一次性完成所有操作的进程。在这里,您使用了三个独立的进程,它们相互连接:一个用于整理文件,一个用于查找行,一个用于剪切您想要的字段。更糟糕的是,很难测试前两个命令中的错误。如果 grep 找不到字符串怎么办?
  • @David,对我来说,grep+cut 与 sed 相比没有优势。另一方面,我认为如果与 sed 混淆,OP 会更容易理解。请参阅 OP 对 jfgagne 的 sed 答案的评论。 '那是什么?'显然,OP 不了解那里发生了什么,因此 OP 在维护此脚本时可能会面临更多困难。
【解决方案2】:

使用 sed:

sed -n -e '/Product Name/{s/.*://p}'

如果要删除:之后的空格:

sed -n -e '/Product Name/{s/.*: *//p}'

【讨论】:

  • 感谢 jfgagne!您的解决方案也有效。顺便说一句,你怎么知道在花括号之间放什么? {s/.*: *//p} ???那是什么?我似乎无法在任何地方找到一个好的资源......
  • @Ryan: s 是 sed 中的替代命令,下一个字符 (/) 是分隔符,. 表示任何字符,* 表示最后出现 0 次或多次字符,: 表示自身,p 是 sed 中的打印命令(如果进行了替换);所以s/.*://p 表示替换: 之前的所有内容以及后面的所有空格,如果进行了替换,则打印结果。请注意,使用 -nargument 禁用了 sed 正常输出。即使没有进行替换,我们也可以使用s/.*://;p 打印结果。
【解决方案3】:
awk -F ": " '$1 ~ /Product Name$/ {print $2}' dmidecode.txt

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 2018-07-18
    • 1970-01-01
    • 2016-03-24
    相关资源
    最近更新 更多