首页 > 解决方案 > 如何从 awk 命令获取下一行

问题描述

以下详细信息位于名为 repo 的文件中。

Date:   2010/10/19 19:05:06

Description:
        Created by rolandb.

Type:   local

我想从 shell 脚本中单独提取详细信息。我有以下代码

#!/bin/bash

        Date=`awk -v s="Date" 'index($0, s) == 1' repo`
        Description=`awk -v s="Description" 'index($0, s) == 1' repo`
        Type=`awk -v s="Type" 'index($0, s) == 1' repo`
        
        echo $Date 
        echo $Description
        echo $Type

它没有捕获描述中的行,因为它在下一行中,输出如下:

Date: 2010/10/19 19:05:06
Description:

Type: local

如何从 shell 脚本中捕获 Description: 下的行?

标签: bashshellscripting

解决方案


同一文件上有多个小 Awk 脚本强烈表明您应该编写一个更大的 Awk 脚本。

awk '$1 == "Date:" { date = $2 " " $3; next }
    $1 == "Description:" { fetch_next = 1; next }
    fetch_next { desc = $0; fetch_next = 0; next }
    $1 == "Type:" {
        print "Date:", date;
        print "Description:", desc;
        print "Type:", $1 }' repo

这包含有关输入文件组织的多个假设。如果文件可能包含多个这样的记录并且您想全部解析它们,那应该很容易。如果 Type 字段并不总是记录中的最后一行,则需要对逻辑进行一些更改。这两个都是常见的问题;在本网站和其他网站上找到有关如何解决这些问题的现有问题应该不难。

还有一个getline专门获取下一行的命令;但我发现上述模式(一个或多个变量来跟踪你的状态)更广泛有用。


推荐阅读