AWK找到第一次出现的字符串并分配给变量进行比较

时间:2016-02-06 05:31:52

标签: linux bash awk sh

我编写了以下代码行,它在分隔符后第一次出现字符串时会爆炸字符串。

echo "$line" | awk -F':' '{ st = index($0,":");print "field1: "$1 "
    =>  " substr($0,st+1)}';

但我不想显示它。想要在变量中出现两次,所以我尝试了下面的代码

explodetext="$line" | awk -F':' '{ st = index($0,":")}';

示例数据:

id:1
url:http://test.com

预期的OutPUt将是:

key=id
val=1

key=url
val=http://test.com

但没有按预期工作。任何解决方案?

由于

2 个答案:

答案 0 :(得分:1)

您的代码已扩展:

echo "$line" \
| awk -F':' '
    {
      st = index($0,":")
      print "field1: " $1 " => " substr($0,st+1)
    }'

此输出仅显示根据第一个冒号分割线。根据您提供的示例数据,您的行似乎包含两个字段,这些字段由找到的第一个冒号分隔。这意味着您无法安全地使用awk的字段分隔符来查找数据(尽管您可以将其用于字段名称),从而使index()成为合理的方法。

一种策略可能是将您的输入放入数组中以进行评估:

#!/usr/bin/awk -f

BEGIN {
  FS=":"
}

{
  record[$1]=substr($0,index($0,":")+1);
}

END {
  if (record["id"] > 0) {
    printf("Record ID %d had a value of %s.\n", record["id"], record["url"])
  } else {
    print "No valid records found."
  }
}

答案 1 :(得分:0)

我认为你的文本文件 input.txt 以下面给出的格式存储:

id:1
url:http://test1.com

您可以使用下面的代码,例如 awkscript 来实现您的目标:

#!/bin/bash
awk '
BEGIN{FS=":"}
{
if ($2 > 0) {
  if ( getline > 0){
  st = index($0,":")
  url = substr($0,st+1);
  system("echo Do something with " url);
  }
  }
}' $1

将代码运行为 ./ awkscript input.txt

注意:我认为输入文件只包含您在评论中确认的一个ID /网址对。