저는 sed와 awk를 배우기 전에 bash를 먼저 배웠습니다. 사람들이 sed, awk, 때로는 grep을 사용하여 많은 일을 수행하는 것을 보았지만 bash 논리를 통해서만 수행할 수 있는 것 같습니다. 나는 생각 중입니다이미 bash 스크립터인 사람이 배우기에 유용한 sed 및 awk의 사용 사례는 무엇입니까?sed와 awk를 완전히 이해하지 않으면 이를 결정하기 어렵습니다.
답변1
이미 손과 무릎으로 기어가는 방법을 알고 있는데 자동차 운전 방법을 배우는 것이 무슨 의미가 있느냐고 묻는 것과 비슷합니다. 예, bash는 기본적인 텍스트 조작이나 간단한 수학에 남용될 수 있지만 가장 느린 도구이고 구문이 복잡하며 오류가 발생하기 쉽습니다. 또한 bash를 포함한 셸은 부동 소수점 작업을 수행할 수 없으므로 셸만 사용하여 수행할 수 있는 작업이 크게 제한됩니다.
이러한 이유 중 하나라도 충분하지만 다음은 매우 간단한 예입니다. 1부터 100,000까지의 숫자가 무작위 순서로 뒤섞인 파일을 가져옵니다.
seq 100000 | shuf > file
이제 모든 홀수를 선택해 보겠습니다. Bash에서는 다음과 같이 할 수 있습니다:
$ time while read num; do [[ $num =~ [24680]$ ]] || echo $num; done < file > newfile
real 0m3.481s
user 0m2.648s
sys 0m0.801s
내 컴퓨터에서는 약 3초 정도 걸립니다. 동일한 작업을 수행했지만 숫자가 1에서 1,000,000 사이인 경우에는 어떻게 될까요?
seq 1000000 | shuf > file
그리고:
$ time while read num; do [[ $num =~ [24680]$ ]] || echo $num; done < file > newfile
real 0m32.483s
user 0m25.035s
sys 0m7.343s
벌써 30초가 넘었습니다! 이제 awk
동일한 내용을 올바른 수학으로 비교해 보세요.
$ time awk '$1 % 2 !=0' file > newfile
real 0m0.344s
user 0m0.340s
sys 0m0.003s
1초도 안 남았습니다. 동일한 텍스트 일치 방법을 사용하는 sed는 어떻습니까/
$ time sed -n '/[13579]$/p' file > newfile
real 0m0.280s
user 0m0.273s
sys 0m0.007s
1초도 채 지나지 않아 이런 일이 다시 일어났습니다. 그럼 10,000,000으로 늘리면 어떨까요?
$ seq 1000000 | shuf > file
$ time awk '$1 % 2 !=0' file > newfile
real 0m4.081s
user 0m3.896s
sys 0m0.090s
$ time sed -n '/[13579]$/p' file > newfile
real 0m2.898s
user 0m2.683s
sys 0m0.111s
$ time while read num; do [[ $num =~ [24680]$ ]] || echo $num; done < file > newfile1
real 5m42.445s
user 4m25.687s
sys 1m15.241s
보시다시피, 셸 솔루션은 비셸 솔루션보다 훨씬 느립니다. 그리고 천만 줄의 파일은 특별히 특이한 것이 아닙니다. 이것은 단지 76M 텍스트 파일입니다. 또한 두 가지 비쉘 솔루션은 모두 문자 길이 측면에서 훨씬 짧고 구문을 이해하면 훨씬 간단합니다.
즉, "당신이 가진 것이 망치뿐이라면 모든 것이 못처럼 보인다"는 사례입니다. 예, bash는 sed
or와 같은 도구를 사용하여 수행할 수 있는 일부 작업을 수행할 수 있지만 awk
훨씬 느리고 제대로 수행되지 않습니다.