我需要在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
获取我想要的行,但如何找到用户名值?
答案 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,表示为$1
,boo
被分配给字段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;
}
}
}
'
}