如何使用linux命令提取与文本文件中特定字段匹配的文本

时间:2013-06-13 12:04:11

标签: linux sed awk

下面是我的文本文件

{"Author":"john"
  "subject":"java"
  "title":"java cook book.pdf"}

{"title":"Php book.pdf"
 "Author":"Smith"
 "subject":"PHP"}

{"Author":"Smith"
"title":"Java book.pdf"}

从上面的数据我想提取所有包含“java”字的标题,我应该得到以下输出

java cook book.pdf
Java book.pdf

请建议我

由于

4 个答案:

答案 0 :(得分:3)

GNU

sed -r '/title.*java/I!d;s/.*:.(.*).}$/\1/' file
java cook book.pdf
Java book.pdf

答案 1 :(得分:2)

您可以使用awk尝试类似的内容:

awk -F: '$1~/title/&&tolower($2)~/java/{gsub(/\"/,"",$2);print $2}' file

阐释:

  • -F:将字段分隔符设置为:
  • $1~/title检查第一列title
  • 的位置
  • tolower($2)~/java/检查第二列java不区分大小写
  • gsub(..)将删除"
  • print $2打印您的第二列

答案 2 :(得分:1)

我会避免任何复杂的解决方案,而是依赖旧的好grep + awk + ​​tr代替:

$ grep '"title":' test.txt | grep '[Jj]ava' | awk -F: '{print $2}' | tr -d [\"}]
java cook book.pdf
Java book.pdf

的工作原理如下:

  1. 提取包含"title":
  2. 的所有行
  3. 从这些行中提取所有包含Javajava
  4. 的行
  5. 将这些行拆分为:并显示第二个字段
  6. 删除"}标志

答案 3 :(得分:0)

你绝对应该使用json解析器来获得完美的结果..我喜欢PHP提供的那个,如果你的文件是,如图所示,用空行分隔的一堆json块:

foreach( explode("\n\n", file_get_contents('/your/file.json_blocks')) as $js_block ):
    $json = json_decode( trim($js_block) );
    if ( isset( $json['title'] ) && $json['title'] && stripos($json['title'], 'java') ):
        echo trim($json['title']), PHP_EOL;
    endif;
endforeach;

对于任何给定的sed / awk / grep / et组合,这将更加肯定,因为json遵循特定的格式,而与a一起使用解析器。举个例子,'title'中的一个简单的新行对json没有实际意义,但会打破Jaypal提供的解决方案..请看一下类似的问题:用正则表达式解析xhtml以及为什么你不应该这样做它:RegEx match open tags except XHTML self-contained tags

相关问题