Bash - 拆分前面的命令参数

Bash - 拆分前面的命令参数

如何解析 bash 中的前一个命令?

例子:

root$ ssh [email protected]
root$ echo !$ &>/tmp/foo.txt
root$ cat /tmp/foo.txt
[email protected]

目标:
仅将 ip 地址发送 1.2.3.4到 foo.txt


我尝试过使用 awk,但没有成功

#doesn't work
cat /tmp/foo.txt |awk '{print $2,$3,$4}' 

我还尝试使用 sed 解析出数字

#doesn't work
sed 's/.//p' /tmp/foo.txt 
sed 's/[0-9]//p' /tmp/foo.txt

注意事项
1.2.3.4 始终是 0.0.0.0 到 255.255.255.255 之间的数字
用户名foo可以是任意长度
[电子邮件受保护]不是必然是传递到 ssh 的唯一参数(例如 .. ssh 1.2.3.4 -l foo)

资源

进一步澄清
最终目标是在我的 .bashrc 中创建一个函数,使我能够轻松删除冲突的 ssh 密钥。

root$ ssh [email protected]  
#some big error message warning about man in the middle attack
root$ ssh-keygen -R 1.2.3.4

答案1

使用您的原始语法:
$ cat /tmp/foo.txt | awk -F@ '{print $2}'
1.2.3.4

答案2

如果您可以使用 ssh 命令的其他语法,它会变得更容易:

ssh -l foo 1.2.3.4 
echo !:3 

但这需要这种精确的语法。

答案3

您可以使用!!访问上一个命令行,以便

echo !! | sed 's/.*@\(.*\).*/\1/' | awk '{print $1}'

可能适合你,例如

echo ssh [email protected] ls | ...
123.456.654.321

echo ssh -p 19111 [email protected] | ...
123.456.654.321

这里唯一的假设是 IP 地址前面有一个 @,并且后面有一个空格或行尾。

答案4

要从之前的 ssh 命令查找数字 IP 地址:

echo $(grep -oP '\d+\.\d+\.\d+\.\d+' <<< "!ssh")

我在手册中没有看到任何内容可以让您找到“与模式匹配的参数”(http://www.gnu.org/software/bash/manual/bashref.html#History-Interaction

很确定你不能将!-style 历史扩展放入函数内,但有命令fc

# return the IP address of the most recent ssh command
sship () { command grep -oP '\d+\.\d+\.\d+\.\d+' < <(fc -l ssh); }

这不会限制您将 IP 地址作为特定(例如最后一个)参数

ssh [email protected] hostname

相关内容