Cat, Grep, Redirect Output… 빈 파일?


8

방금 도망 갔어

cat /opt/webapplications/Word/readme.log | grep -v 'Apple'

나는 모든 줄을이었다 내가 기대되었다는 CLI에 출력을 가지고 readme.log그 '가 포함되지 않은를 Apple'...

다음에 나는 달렸다 ...

cat /opt/webapplications/Word/readme.log | grep -v 'Apple' > /opt/webapplications/Word/readme.log

그러나 /opt/webapplications/Word/readme.log비어 있습니다.

왜 이런 일이 일어 났는지, 또는 내가 이것에 대해 올바른 길을 설명해 줄 수 있습니까?



1
당신이 읽고 같은 파일 및 bash는 프로세스 (오른쪽에서 왼쪽) 첫 리디렉션 정보 쓰기 시도
AAAAA 분석 재개 모니카 말한다

답변:


14

첫 번째 작업 >은 작성하려는 파일을 작성하는 것입니다. 파일이 이미 존재하는 경우 해당 컨텐츠가 삭제됩니다. (또한 STDIN뿐만 아니라 파일에서 작동 cat하기 때문에 명령문에서 사용할 필요가 없습니다 grep.)

이를 수행하는 올바른 방법은 임시 파일을 사용하여 읽거나 쓰는 것입니다. 그래서

cp /opt/webapplications/Word/readme.log /tmp/readme.log
grep -v 'Apple' /tmp/readme.log > /opt/webapplications/Word/readme.log

또는

grep -v 'Apple' /opt/webapplications/Word/readme.log > /tmp/readme.log
mv /tmp/readme.log /opt/webapplications/Word/readme.log

작동 할 것이다.


1

동일한 파일 ( >) 로 경로 재 지정을 수행 할 때 , 쉘은 cat명령을 호출하고 입력을 읽기 전에 파일을 작성 / 절단 할 수 있습니다 ( “sort file1> file1”이 작동하지 않는 이유는 무엇입니까? ). 파일을 필터링하려면 출력을 다른 파일로 리디렉션하거나 리디렉션을 피하는 것이 좋습니다. 예를 들면 다음과 같습니다.

grep -v 'Apple' readme.log | tee readme.log

더 좋고 안전한 방법은 다음과 같은 종류의 작업을 위해 설계된 인플레 이스 편집기를 사용하는 것입니다.

sed -i '.bak' '/Apple/d' readme.log

또는 사용 ex(Vim의 일부) :

ex +g/Apple/d -cwq readme.log

관련 :

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.