
cat
파일을 읽은 다음 필터링을 위해 파이프하는 데 사용할 다른 2개와 함께 화면에서 실행되도록 이 명령을 코딩하려고 합니다 awk
. 다음은 명령입니다.
screen -d -m /bin/cat /var/www/html/filter/unfiltered.txt | awk '{print $1}' > /var/www/html/filter/first.txt
분리된 화면을 확인하면 목록을 필터링하는 것을 볼 수 있으며, 완료되면 파일이 first.txt
생성되지만 비어 있습니다. 출력 로그를 위해 화면에서 사용하는 방법을 보았지만 -L
필터링되지 않은 목록이 있는 동일한 폴더로 출력을 보내고 싶습니다 first.txt
. 왜 성공적으로 실행되는지 알 수 없지만 출력 파일은 매번 비어 있습니다. screen -d -m
생성된 파일 없이 실행하면 비어 있지 않습니다. 화면 명령에 뭔가 빠진 것 같습니다. 방금 화면을 사용하기 시작했습니다. 또 언제 포스팅할지는 잘 모르겠습니다.
답변1
이것이 작동하지 않는 이유는 쉘이 명령을 다음과 같이 두 부분으로 분할하기 때문입니다.
screen -d -m /bin/cat /var/www/html/filter/unfiltered.txt
awk '{print $1}' >/var/www/html/filter/first.txt
별도의 pty에서 실행 screen
됩니다 . cat
그러면 출력이 없습니다표준 출력로 파이프합니다 awk
.
파이프가 화면 아래에서 실행되도록 하려면 이를 쉘의 다른 인스턴스와 그룹화해야 합니다.
screen -d -m bash -c 'cat /var/www/html/filter/unfiltered.txt | awk "{print $1}" >/var/www/html/filter/first.txt'
그렇게 하고 나면 이것이 불필요한 사용이라는 것이 분명해지며 cat
실제로 명령은 다음과 같이 단순화될 수 있습니다.
screen -d -m bash -c 'awk "{print $1}" </var/www/html/filter/unfiltered.txt >/var/www/html/filter/first.txt'
내부 따옴표를 단일에서 이중으로 변경했습니다. 이는 전체 명령을 보호하기 위해(특히 $1
초기 평가로부터) 작은따옴표를 사용했기 때문입니다 .