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길이에는 제한이 없습니다.
[이메일 보호됨]아니요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

관련 정보