입력 파일과 동일한 이름의 파일에 출력이 저장됨 [중복]

입력 파일과 동일한 이름의 파일에 출력이 저장됨 [중복]

입력 파일이 있고 일부 명령을 실행하지만 출력을 입력 파일과 동일한 이름으로 저장하고 싶습니다.

다음 명령을 시도했지만 출력 파일이 비어 있습니다.

cat file1 | grep "YISHA" > file1

답변1

GNU 시스템에서는 다음을 사용할 수 있습니다 sed(GNU 구현):

sed -i -n '/YISHA/p' file1

FreeBSD 또는 이에 상응하는 OS/X:

sed -i '' -n '/YISHA/p' file1

또는 sponge다음에서 사용더 많은 유틸리티:

grep "YISHA" file1 | sponge file1

답변2

데이터를 삭제할 때 파일 자체에 쓰고 나중에 자를 수 있습니다.

{
  grep YISHA
  perl -e 'truncate STDOUT, tell STDOUT'
} < file 1<> file

물론 여기에서 다음을 수행할 수 있습니다 perl.

perl -ne 'print if /YISHA/; END{truncate STDOUT, tell STDOUT}' < file 1<> file

perl-i내부 편집 옵션 도 있습니다 ( sedGNU에서 복사한 옵션).

perl -ni -e 'print if /YISHA/' file

하지만 처럼 sed이름이 같은 새 파일을 생성하지만 실제로 파일을 다시 작성하지는 않습니다.제자리에이는 파일의 inode 번호와 기타 속성이 프로세스에서 영향을 받을 수 있음을 의미합니다. 또한 심볼릭 링크도 끊어집니다.

답변3

요청 시 쉘이 안전한 임시 파일을 제공할 수 있습니다.

grep "YISHA" <<IN > file
$(cat file)
IN

file그러면 끝에서 빈 줄이 제거됩니다.grep( 빈 줄을 핑 하지 않는 이상 관련이 없어야 합니다 ). 이것이 중요하다면 명령 대체 다음에 가서 echo .마지막 줄을 제거하십시오.cat

사용할 수 있는 또 다른 옵션은 입니다 dd. 예를 들어:

seq 5000000 >/tmp/temp
-rw-r--r-- 1 mikeserv mikeserv 38888896 Mar 11 04:20 /tmp/temp

파이프 버퍼를 초과할 만큼 큰 더미 파일입니다.

</tmp/temp grep 5\$ |
dd bs=4k of=/tmp/temp conv=notrunc,sync

가능한 파이프 버퍼의 크기를 초과한 것을 볼 수 있습니다.

949+1 records in
950+0 records out
3891200 bytes (3.9 MB) copied, 0.164471 s, 23.7 MB/s

notrunc변환이 지정되면 dd읽은 내용을 쓰는 경우를 제외하고 출력 파일은 건드리지 않습니다. seek=원하는 경우 이 입력 데이터를 파일의 다른 오프셋에 배치할 수도 있습니다. 하지만... 파일은 여전히 ​​잘려야 합니다. 마지막 입력 버퍼도 플러시한 것을 볼 수 있습니다 dd. 949+1개의 레코드를 읽었지만 950개의 레코드를 기록했습니다. - dd마지막 입력 청크를 null을 사용하여 전체 4k 크기로 동기화합니다.(stdio를 사용하는 도구에서 파이프 입력을 받을 때 합리적인 청크 크기를 선택하는 것이 가능한 경우가 많습니다. 예를 들어 grep).

그래서...

ls -l /tmp/temp; tail /tmp/temp
-rw-r--r-- 1 mikeserv mikeserv 38888896 Mar 11 04:22 /tmp/temp

4999991
4999992
4999993
4999994
4999995
4999996
4999997
4999998
4999999
5000000

작성된 내용 외에는 여전히 동일한 파일입니다 dd.

하지만...

dd if=/dev/null bs=4k seek=950 of=/tmp/temp

dd...작성된 부분까지 잘라낼 수 있고...

0+0 records in
0+0 records out
0 bytes (0 B) copied, 0.000153783 s, 0.0 kB/s

...아무 일도 일어나지 않은 것 같지만...

ls -l /tmp/temp; tail /tmp/temp
-rw-r--r-- 1 mikeserv mikeserv 3891200 Mar 11 04:25 /tmp/temp
4999915
4999925
4999935
4999945
4999955
4999965
4999975
4999985
4999995

dd그 시간을 단축하세요. 하지만 실제로는 sync파일 끝에 마지막으로 편집된 부분 블록이 있으므로...

tail /tmp/temp | wc -c 

2383

...그리고 끝에는 null 값이 많이 있습니다.

관련 정보