여러 명령과 명령 대체를 사용하여 배열을 채우는 것이 좋지 않습니까?

여러 명령과 명령 대체를 사용하여 배열을 채우는 것이 좋지 않습니까?

저는 기술 지원을 제공할 때 경험이 부족한 직원을 위해 정보 검색을 "중앙화"하고 단순화하기 위해 bash 스크립트를 작성하고 있습니다.

가장 진지한 Bash 스크립터의 관점에서 이 코드는 얼마나 수용 가능합니까? 간단히 말해서 이것은 본질적으로 전체 스크립트입니다(실제로는 bash 쉘입니다, 하하).

#!/bin/bash

declare -a array
array=(`grep -w foo /var/log/bar.log  | awk '{print $1,$2,$3,$14,$16}' | sed 's/<//g; s/>,//g; s/>//g;' | tr [:blank:] , && ssh XXX.XXX.XXX.XXX 'grep -w foo /var/log/bar.log' | awk '{print $1,$2,$3,$14,$16}' | sed 's/<//g; s/>,//g; s/>//g;' | tr [:blank:] ,`)

그런 다음 스크립트는 계속해서 어레이에 대한 작업을 진행합니다. 내가 이런 식으로 실행하는 이유는 모든 것이 RAM에 유지되기를 원하기 때문입니다. 필요한 경우 자세히 설명할 수 있습니다.

코드가 매우 보기 흉하다는 것은 알지만, 목표나 프로그래밍 언어를 변경하거나 추가 코드 줄을 추가하지 않고 이 작업을 수행할 수 있는 보다 깔끔한 방법이 있습니까? sed 정규 표현식을 정리할 수 있다는 것을 알고 있지만 현재로서는 더 나은 것을 생각할 수 없습니다...

답변1

네, 어쩌면, 가끔은...상황에 따라 다릅니다.

이런 장황한 답변을 해서 죄송합니다. 질문에는 배열의 목적과 용도, 데이터 파일의 내용에 대한 언급이 없으므로 구체적인 내용을 말하기는 어렵습니다.

요약: 아니요, 이는 쉘 스크립트에서 데이터를 처리하는 일반적이고 관용적인 방법이 아닙니다.


작성된 코드는 줄이 꽤 길어서 이해하기 어렵습니다. 대부분의 작업은 awk단일 스크립트(오늘은 작성하지 않겠습니다)로 수행 할 수 있는 것 같습니다 . 내 코드 검토가 실패할까봐 걱정됩니다.

(아마도) 많은 양의 데이터를 배열에 넣으려는 사실은 나중에 하나 이상의 쉘 루프에서 해당 배열을 처리하게 될 것임을 알려줍니다. 단순한 루프라면 결과를 루프에 직접 전달하는 것은 어떨까요?

두고 보자.”쉘 루프를 사용하여 텍스트를 처리하는 것이 왜 나쁜 습관으로 간주됩니까?".

명령 파이프라인이 제한된 형식(셸에서 제대로 작동하도록 보장되는 단일 단어 또는 문자열)의 몇 가지 항목만 생성하는 경우에는 여전히 문제가 없을 수 있지만 여전히 관용적이지는 않습니다.

데이터는 특정 시점에 읽어야 하며, 배열에 저장하는 번거로움 없이 데이터를 읽는 동안 사용할 수도 있습니다. 데이터로 수행하는 작업에 따라 awk또는 sed(또는 다른 도구)를 사용하여 직접 수행할 수 있습니다.

내가 이해한 바로는 쉼표로 구분된 문자열을 생성하고 있다는 것입니다. 아마도 각 행을 배열의 항목으로 사용하여 CSV 데이터 세트를 생성하는 것일까요? 이것은완벽한예를 들어 awk배열에 임시 저장하지 않고 다시 입력합니다. 또는 다음 중 하나를 입력하세요.CSV 키트이와 관련된 도구입니다. 실제 파일로 전달하여 하나 이상의 다른 스크립트에서 처리할 수도 있습니다.

나처럼 대규모 데이터 세트로 작업하는 사람들에게는 파일을 쉘 변수로 읽는 것이 불가능합니다. 다행스럽게도 대부분의 표준 Unix 도구는 필터처럼 작동하며 파이프를 사용하여 프로그램 단계 간에 대략 한 줄씩 데이터를 전달할 수 있습니다. 데이터를 "RAM으로" 읽어도 속도는 향상되지 않습니다.

나는 거의안 돼요파일의 데이터를 모든 유형의 쉘 변수로 읽습니다. 나는 배열을 보내는 것보다 배열에서 간단한 매개변수 대체를 수행하는 것이 더 쉬울 때 정적 문자열, 수명이 짧은 임시 값 또는 카운터를 나타내기 위해 변수를 더 자주 사용하고, 정적 데이터를 나타내기 위해 배열을 사용합니다 sed(예: ${arr[@]%.*}파일 이름의 일부 확장자를 제거). ) arr또는 짧은 루프로 데이터를 집계하는 데 사용됩니다.

관련 정보