在bash中搜索.netrc文件,并返回给定计算机

时间:2015-05-04 06:56:58

标签: bash awk grep

我需要在bash中使用(最便携的)的方式来搜索~/.netrc文件,搜索特定的machine api.mydomain.com然后在下一行,拉出用户名值。

格式为:

machine a.mydomain.com
  username foo
  passsword bar
machine api.mydomain.com
  username boo
  password far
machine b.mydomain.com
  username doo
  password car

因此,它应匹配api.mydomain.com并从此示例中返回boo

awk '/api.mydomain.com/{getline; print}' ~/.netrc

获取我想要的行,但如何找到用户名值?

5 个答案:

答案 0 :(得分:3)

$ awk '/api.mydomain.com/{getline; print $2}' ~/.netrc
boo

要在变量中捕获它:

$ name=$(awk '/api.mydomain.com/{getline; print $2}' ~/.netrc)
$ echo "$name"
boo

默认情况下,awk根据空格将记录(行)拆分为 fields 。因此,在username boo行上,username被分配到字段1,表示为$1boo被分配给字段2,表示为$2

答案 1 :(得分:1)

如果您想避免使用getline功能,请使用:

awk '/api.mydomain.com/ {f=NR} f&&f+1==NR {print $2}' ~/.netrc
boo

Ed在这里写道:避免使用它 http://awk.info/?tip/getline

这将找到模式的行号,然后是
当行号是一个时,打印字段#2

可以缩短一些:

awk '/api.mydomain.com/ {f=NR} f&&f+1==NR&&$0=$2' ~/.netrc

awk 'f&&!--f&&$0=$2; /api.mydomain.com/ {f=1}' ~/.netrc

这可能是最有效的方法 如果域后有注释行或空行,则其他解决方案将失败。

awk '/api.mydomain.com/ {f=1} f && /username/ {print $2;f=0}' ~/.netrc
boo

如果找到域,请设置标志f。如果标记f为真且下一行有username打印字段#2

答案 2 :(得分:1)

这个sed和我一样便携:

sed -n '
    /machine[   ]\{1,\}api.mydomain.com/ {      
        # we have matched the machine
        :a
        # next line
        n
        # print username, if matched
        s/^[    ]\{1,\}username[        ]\{1,\}//p
        # goto b if matched
        tb
        # else goto a
        ba
        :b
        q
    }
' ~/.netrc

括号中的空格是空格和制表符。

以新鲜的眼光看待这一点,这就是我现在要写的内容:

awk -v machine=api.mydomain.com '
    $1 == "machine" {
        if (m)
            # we have already seen the requested domain but did not find a username
            exit 1
        if ($2 == machine) m=1
    }
    m && $1 == "username" {print $2; exit}
' ~/.netrc

或者如果你喜欢不可读的oneliners

awk '$1=="machine"{if(m)exit 1;if($2==M)m=1} m&&$1=="username"{print $2;exit}' M=api.mydomain.com ~/.netrc

答案 3 :(得分:0)

以下是您可以做的事情:

 awk '/api.mydomain.com/{getline;print $2}' ~/.netrc ##$2 will print username

答案 4 :(得分:0)

这个vanilla Bourne shell(包括Bash,KSH等)函数应该解析任何有效的.netrc文件:它处理了我能想到的一切。使用netrc-fetch MACHINE [FIELD]调用。对于您的问题,它将是netrc-fetch api.mydomain.com user

netrc-fetch () {
  cat $HOME/.netrc | awk -v host=$1 -v field=${2:-password} '
    {
      for (i=1; i <= NF; i += 2) {
        j=i+1;
        if ($i == "machine") {
          found = ($j == host);
        } else if (found && ($i == field)) {
          print $j;
          exit;
        }
      }
    }
  '
}