awk가 포함된 명령 별명 사용

awk가 포함된 명령 별명 사용
alias ip="ifconfig eth0 | grep '255$' | awk '{print '\$2'}'"

alias매개변수 없이 명령을 사용하면 다음과 같은 결과를 얻습니다.

alias ip='ifconfig eth0 | grep '\' '255$'\'' | awk '\''{print '\''$2'\''}'\'''

그러나 실행 ip하면

inet xxx.xxx.x.xxx netmask xxx.xxx.xxx.x broadcast xxx.xxx.x.xxx

을 실행하면 ifconfig eth0 | grep '255$' | awk '{print '\$2'}'와 같은 IP만 성공적으로 얻을 수 있습니다 xxx.xxx.x.xxx.

나는 이 상황이 혼란스럽다. 도와주세요?

답변1

그 모든 인용 지옥 후에 당신이 실행하게 되는 것은 awk '{print }'. 이는 별칭 할당에서 \$2백슬래시가 확장을 방지하는 큰따옴표로 묶인 문자열에 있기 때문입니다 $2. 그러나 별칭을 사용하면 대화식 쉘에서 비어 있을 수 있는 $2현재 위치 인수로 인용이 해제되고 확장됩니다 . $2인수가 없는 명령은 print전체 입력 행을 인쇄합니다.

가장 쉽게 볼 수 있는 것은 다음과 같습니다 set -x.

$ set -x
$ ip
+ grep '255$'
+ /sbin/ifconfig eth0
+ awk '{print }'
        inet ...  netmask 255.0.0.0  broadcast 10.255.255.255

(그리고 해당 인터페이스의 넷마스크가 잘못된 것 같습니다.)

함수를 사용하면 이와 같은 작업을 수행하는 것이 더 쉽습니다. 전체 명령을 인용할 필요가 없기 때문입니다.

myip() {
    ifconfig eth0 | grep '255$' | awk '{print $2}'
}

그러나 awkgrep이 수행하는 작업을 수행하는 것이 가능합니다. 아마도 일치해서는 안 되지만 키워드는 일치해야 할 255수도 있습니다 inet.

myip() {
    ifconfig eth0 | awk '/inet/ {print $2}'
}

또는 좀 더 명확하게 말하자면:

myip() {
    ifconfig eth0 | awk '$1 == "inet" {print $2}'
}

이는 또한 행 /inet/일치도 방지합니다 inet6.

이는ip또 다른 유틸리티.

답변2

방금 컴퓨터에 복사했는데 시도해 볼 수 있나요?

alias ip="ifconfig eth0 | grep '255$' | awk '{print \$2}'"

이것은 나에게 효과적입니다.

source .bashrc업데이트하세요

관련 정보