파이프를 사용하면 차이가 있나요?

파이프를 사용하면 차이가 있나요?

우분투 12.04를 사용합니다.

파이프 사용(5회):

$ time echo XYZ | sed 's/X/A/g' | sed 's/Y/B/g' | sed 's/Z/C/g'
ABC

real    0m0.005s
user    0m0.000s
sys 0m0.000s
$ time echo XYZ | sed 's/X/A/g' | sed 's/Y/B/g' | sed 's/Z/C/g'
ABC

real    0m0.004s
user    0m0.000s
sys 0m0.000s
$ time echo XYZ | sed 's/X/A/g' | sed 's/Y/B/g' | sed 's/Z/C/g'
ABC

real    0m0.004s
user    0m0.004s
sys 0m0.000s
$ time echo XYZ | sed 's/X/A/g' | sed 's/Y/B/g' | sed 's/Z/C/g'
ABC

real    0m0.005s
user    0m0.000s
sys 0m0.000s
$ time echo XYZ | sed 's/X/A/g' | sed 's/Y/B/g' | sed 's/Z/C/g'
ABC

real    0m0.005s
user    0m0.004s
sys 0m0.000s

파이프가 없는 경우(5회):

$ time echo XYZ | sed 's/X/A/g; s/Y/B/g; s/Z/C/g'
ABC

real    0m0.003s
user    0m0.000s
sys 0m0.004s
$ time echo XYZ | sed 's/X/A/g; s/Y/B/g; s/Z/C/g'
ABC

real    0m0.003s
user    0m0.000s
sys 0m0.000s
$ time echo XYZ | sed 's/X/A/g; s/Y/B/g; s/Z/C/g'
ABC

real    0m0.003s
user    0m0.000s
sys 0m0.000s
$ time echo XYZ | sed 's/X/A/g; s/Y/B/g; s/Z/C/g'
ABC

real    0m0.003s
user    0m0.004s
sys 0m0.000s
$ time echo XYZ | sed 's/X/A/g; s/Y/B/g; s/Z/C/g'
ABC

real    0m0.003s
user    0m0.000s
sys 0m0.000s
$ 

파이프를 사용하지 않는 것이 더 빠르다는 것은 분명합니다. 따라서 스크립트를 최적화하는 데 사용할 수 있습니다.

$ echo ABC | sed 's/A/X/g; s/X/Y/g'
YBC
$ 

내 질문:sed를 병합하면 항상 동일한 출력이 생성됩니까?

답변1

짧은 대답은 다음과 같습니다.관로다른 대체를 수행하려면 쉘이 여러 번 분기되어야 합니다.

반면, sed다양한 대체 명령이 포함된 표현식에서는 셸이 한 번만 포크하면 됩니다.

따라서 다음과 같이 단일 표현식에 다양한 명령을 포함하는 것이 더 효율적입니다.

sed 's/X/A/g; s/Y/B/g; s/Z/C/g'

두 번째 부분에 답하기 위해 위의 내용은 다음과 같습니다.느리게변형:

sed 's/X/A/g' | sed 's/Y/B/g' | sed 's/Z/C/g'

답변2

예, 게시한 두 명령은 100% 동일하므로 파이프를 사용하지 않도록 스크립트를 안전하게 변경할 수 있습니다.

echo XYZ그러나 당신의 추론에는 결함이 있습니다. 실제 호출이 아니라 걸리는 시간만 측정하고 있습니다 sed. 그러나 파이프를 사용하지 않는 것이 여전히 더 빠르다는 것을 알게 될 것입니다 :)

dennis@spirit:~$ time sh -c 'echo XYZ | sed -e s/X/A/ | sed -e s/Y/B/ | sed -e s/Z/C/'
ABC

real    0m0.009s
user    0m0.000s
sys 0m0.012s
dennis@spirit:~$ time sh -c 'echo XYZ | sed -e s/X/A/ -e s/Y/B/ -e s/Z/C/'
ABC

real    0m0.006s
user    0m0.000s
sys 0m0.006s

답변3

sed조건부로 포크 할 수 있는 GNU 확장도 있습니다 :

sed '/num/s//echo "$((num+1))"/e'

info sed

e

이 명령을 사용하면 쉘 명령의 입력을 패턴 공간으로 파이프할 수 있습니다. 대체가 이루어지면 패턴 공간에 있는 명령이 실행되고 해당 출력이 패턴 공간을 대체합니다. 후행 줄 바꿈은 억제됩니다. 실행할 명령에 NUL 문자가 포함되어 있으면 결과가 정의되지 않습니다.

이것은 GNU 'sed' 확장입니다.

관련 정보