원격 컴퓨터에서 복잡한 awk 스크립트를 실행하는 방법은 무엇입니까?

원격 컴퓨터에서 복잡한 awk 스크립트를 실행하는 방법은 무엇입니까?

(원격 시스템에서) 중복 행을 제거하려면 원격 시스템에서 다음 awk 구문을 실행해야 합니다.

"!" 앞에 "\"도 추가했지만 작동하지 않았습니다.

 ssh root@$remote_machine "    awk '/^#/ || !a[$0]++' /tmp/file > /tmp/file.new"
-bash: !a[$0]++': event not found
 ssh root@$remote_machine "    awk '/^#/ || \!a[$0]++' /tmp/file > /tmp/file.new"

 awk: cmd. line:1: /^#/ || \!a[-bash]++
 awk: cmd. line:1:         ^ backslash not last character on line
 awk: cmd. line:1: /^#/ || \!a[-bash]++
 awk: cmd. line:1:         ^ syntax error

이 문제를 해결하는 방법에 대한 아이디어가 있습니까?

내 파일의 예:

# ssh root@$remote_machine "   cat  /tmp/file "
fref
ref
erv
rtgrvf
t
ttt
ttt
ttt
f
f
dd
dd
efcref
vgt
vrt
brye
nhrtuym

또한 다음을 시도했습니다.

# ssh root@$remote_machine "    awk '/^#/ || "'!'"a[$0]++' /tmp/file "
fref

답변1

히스토리 확장 및 이스케이프를 !방지하려면 작은따옴표로 묶어야 합니다 .bash\$

ssh root@$remote_machine "    awk '/^#/ || "'!'"a[\$0]++' /tmp/file > /tmp/file.new"

man bash!다음을 사용하여 탈출을 시도하는 이유를 설명했습니다 \.

문자를 큰따옴표로 묶으면 기록 확장이 활성화된 경우 $, `, \ 및 !를 제외한 따옴표 안의 모든 문자의 리터럴 값이 유지됩니다. $ 및 ` 문자는 큰따옴표 안에 특별한 의미를 유지합니다. 백슬래시는 뒤에 $, `, ", \ 또는 문자 중 하나가 올 때만 특별한 의미를 유지합니다. 큰따옴표는 큰따옴표 안에 백슬래시를 넣어 따옴표로 묶을 수 있습니다. 활성화되면 백슬래시를 사용하지 않는 한 기록 확장이 수행됩니다. 큰따옴표 안에 !가 표시됩니다. ! 앞의 백슬래시는 제거되지 않습니다.

이스케이프 후에도 문자 \는 제거되지 않습니다 !. 이는 awk발생하는 구문 오류를 설명합니다.

관련 정보