텍스트 문서의 특정 제목 아래 항목 목록을 만드는 방법은 무엇입니까? (리눅스/배시)

텍스트 문서의 특정 제목 아래 항목 목록을 만드는 방법은 무엇입니까? (리눅스/배시)

최대한 간단하게 설명하자면, Linux에서 bash/sed/awk 및 기본 OS 명령을 사용하여 아래에 여러 문자열(서버 이름)이 포함된 텍스트 파일에 여러 헤더가 있는 목록을 만들려고 합니다. 그런 다음 스크립트를 갖고 런타임 시 옵션/매개변수로 전달하는 특정 제목 아래의 각 항목에 대해 다양한 작업을 실행할 수 있기를 원합니다.

이 텍스트 파일의 예: (이 항목은 단일 열의 관련 제목 아래에 정렬되어야 합니다. 이 페이지에서는 그런 식으로 표시할 수 없습니다.)

[main_server_list]
Jupiter
Saturn
Thisguy
Thatguy
BuffalO
randomspite
coffeebinge

[alternate_server_list]
Jupiter
Saturn

[Tertiary_server_list]
Thisguy
Thatguy
coffeebinge

[Enough_already]
BuffalO
randomspite

따라서 기본적으로 모든 컴퓨터의 디렉터리에 파일을 복사하려면 다음과 같이 하면 됩니다.

   # bash maincopyscript.sh [main_server_list]

그리고 "루프"는 이를 설치할 서버 목록이 [main_server_list] 헤더 아래의 모든 항목이라는 것을 알고 있지만 다른 헤더 아래의 다른 모든 항목은 무시합니다.

마찬가지로, 나는 또한 다음을 할 수 있기를 원합니다:

   # bash maincopyscript.sh [Tertiary_server_list]

동일한 기능을 기대합니다. 이번에는 [Tertiary_server_list] 헤더 아래 항목에 대해서만 "루프"를 실행한 다음 완료합니다.

마지막으로, 원하는 경우 순서에 관계없이 여러 헤더를 지정할 수 있기를 바랍니다. 예를 들어:

   # bash maincopyscript.sh [Enough_already] [alternate_server_list]

그런 다음 이 두 헤더 아래 항목에 대해서만 스크립트에 지정된 작업을 실행한 다음 완료해야 합니다.

기본적으로 bash/sed/awk를 사용하여 이 작업을 수행하는 방법에 대한 아이디어를 얻으셨기를 바랍니다. (필요하다면 다른 도구를 사용해도 됩니다)

예, 저는 ansible/puppet/chef가 이러한 결과를 얻는 데 도움이 될 수 있다는 것을 알고 있습니다. 하지만 어쨌든 이렇게 하고 싶은 특별한 이유가 있습니다. 이 문제에 대한 기존 게시물을 검색하는 데 한두 시간을 소비했지만 찾을 수 없어서 마침내 질문을 하기로 결정했습니다. 어떤 도움이라도 대단히 감사하겠습니다!

(보너스, 제목과 그룹 자체를 정확히 동일한 형식으로 유지하면서 각 제목 아래에 항목을 알파벳 순서로 배치하는 방법을 누군가 나에게 보여줄 수 있다면 좋을 것입니다!)

답변1

awk를 사용하여 헤더 아래에서 이름을 추출하여 넣을 수 있습니다.대량으로 바꾸다, 그리고 반복 가능한 배열을 사용합니다 for. 여기의 스크립트는 명령줄에서 스키마를 가져옵니다.

#!/bin/bash
patt=$1
if [ -z "$patt" ] ; then echo "need an argument" ; exit 1 ; fi
A=( $(awk '/^\[/ {p = 0};
           /^\['"$patt"'\]/ {p=1; next}
           p && !/^ *$/ ;' < servers )  )

for x in "${A[@]}" ; do 
    echo doing something with "$x" 
done

그래서,

$ bash for_all.sh alternate_server_list
doing something with Jupiter
doing something with Saturn

awk프로그램 에서 :
/^\[/ {p = 0}- 여는 괄호가 줄의 첫 번째 문자이면 p를 0으로 설정합니다.
/^\['"$patt"'\]/ {p=1; next}- 패턴과 일치하면 p를 1로 설정하고 다음 줄로 점프합니다. 패턴은 쉘 변수에서 awk에 제공되므로 정규식으로 처리됩니다. 따옴표는 코드의 일부가 작은 따옴표 안에 있고, 변수가 큰 따옴표 안에 있고, 작은 따옴표 안에 더 많은 코드가 있기 때문에 흥미롭습니다. 비슷 'foo' "$var" 'bar'하지만 공백이 없습니다.
p && !/^ *$/- p가 설정되어 있고 줄이 비어 있지 않으면(시작과 끝 사이에 공백만 있음) 이를 인쇄합니다(기본 동작).


아, 그리고 목록 항목에 흥미로운 내용(예: 공백)이 포함되어 있으면 충돌이 발생하고 타버릴 것입니다.

관련 정보