(원격 시스템에서) 중복 행을 제거하려면 원격 시스템에서 다음 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
발생하는 구문 오류를 설명합니다.