![여러 명령과 명령 대체를 사용하여 배열을 채우는 것이 좋지 않습니까?](https://linux55.com/image/118725/%EC%97%AC%EB%9F%AC%20%EB%AA%85%EB%A0%B9%EA%B3%BC%20%EB%AA%85%EB%A0%B9%20%EB%8C%80%EC%B2%B4%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EB%B0%B0%EC%97%B4%EC%9D%84%20%EC%B1%84%EC%9A%B0%EB%8A%94%20%EA%B2%83%EC%9D%B4%20%EC%A2%8B%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
저는 기술 지원을 제공할 때 경험이 부족한 직원을 위해 정보 검색을 "중앙화"하고 단순화하기 위해 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
또는 짧은 루프로 데이터를 집계하는 데 사용됩니다.