Bash - 前のコマンド引数の分割

Bash - 前のコマンド引数の分割

Bashで以前のコマンドを解析する方法は?

例:

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

ターゲット:
1.2.3.4foo.txtにIPアドレスのみを送信する


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長さに制限はありません。
[Eメール保護]はいいいえsshに渡される唯一のパラメータでなければなりません(例:ssh 1.2.3.4 -l foo)。

リソース

追加の説明
最終的な目標は、競合するSSHキーを簡単に削除する機能を.bashrcに作成することです。

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

関連情報