여기에 문자열(<<<)과 함께 sed를 사용하고 -a를 읽으세요.

여기에 문자열(<<<)과 함께 sed를 사용하고 -a를 읽으세요.

나는 문자열의 모든 단어를 변수에 사용하고 할당 sed합니다 <<<. read내가 한 일은 다음과 같습니다.

read -a A0 <<< $(sed '2q;d' /proc/stat)

따라서 sed파일의 두 번째 줄을 읽고 file즉시 종료합니다. 읽은 행이 sed입력되고 <<<수신된 입력이 확장되며 sed결과 read -a값이 <<<배열 요소에 할당됩니다. 이런 방식으로 <<<and 를 사용하는 것이 sed좋은 생각입니까, 아니면 반대하는 분명한 이유가 있습니까? 가장 중요한 것은 이 작업을 수행하는 더 빠른 방법이 있습니까?

답변1

배열 할당을 직접 사용할 수 있습니다.

A0=($(sed '2q;d' /proc/stat))

이는 와일드카드를 적용한다는 점에 유의하십시오. 명령 출력에 쉘 와일드카드가 포함된 경우 와일드카드가 포함된 단어는 일치하는 파일 목록(있는 경우)으로 대체됩니다. 명령 출력에 문자 중 하나가 포함될 수 있는 경우 \[?*임시로 와일드카드를 끄십시오.

set -f
A0=($(sed '2q;d' /proc/stat))
set +f

이는 다음을 사용하는 것보다 약간 빠릅니다 read.

$ time for i in {1..1000}; do read -a A0 <<< $(sed '2q;d' /proc/stat); done

real    0m2.829s
user    0m0.220s
sys     0m0.480s

$ time for i in {1..1000}; do A0=($(sed '2q;d' /proc/stat)); done

real    0m2.388s
user    0m0.128s
sys     0m0.276s

버전 4.0 이상의 경우 bash다음을 사용할 수 있습니다 mapfile.

mapfile -t < <(sed '2q;d' /proc/stat)

그러나 mapfile가장 느린 것 같습니다.

$ time for i in {1..1000}; do mapfile -t < <(sed '2q;d' /proc/stat); done

real    0m3.990s
user    0m0.104s
sys     0m0.444s

답변2

제 생각에는 구문이 너무 복잡해 보입니다. 대신 다음을 사용합니다.

read -a A0 < <( sed '2q;d' /proc/stat )

<<< word나는 보통 다른 명령이 아닌 변수로부터 입력을 얻기 위한 명령이 필요할 때 이 구문을 사용합니다.

관련 정보