파일의 특정 부분의 값을 가져옵니다.

파일의 특정 부분의 값을 가져옵니다.

다음 형식의 구성 파일이 있습니다.

<Title>
 [part1]
  A.File = a
  A.Val = val1
  B.File = a
  B.Val = val1
 [part2]
  A.File = a1
  A.Val = val2 
  B.File = a
  B.Val = val1

첫 번째 부분에서만 값을 추출하고 싶습니다.

 #!/bin/sh 
getCalibDate()
{
 file="/path/of/config/file"
 value=`cat ${file} | grep Val | cut -d'=' -f2`
    for v in $value
    do
            echo $v
    done
}
getCalibDate

위 스크립트는 모든 값을 반환합니다. 첫 번째 부분(part1)에서만 값을 얻으려면 어떻게 해야 합니까?

답변1

그 이후에 행이 4개만 있는 경우 다음 옵션을 [part1]사용할 수 있습니다 .-A4grep

cat ${file} | grep -A4 "part1" | cut -d'=' -f2`

일반적인 경우([part1] 뒤에 4줄 이상) sed두 부분 사이에 텍스트를 가져오려면 다음을 수행합니다.

cat ${file} | sed -n "/part1/,/part2/p" | head -n-1

headpart2마지막에 중복된 항목을 삭제 하면 됩니다 .

~처럼테든을 사용할 필요가 없다고 말하면 cat다음을 수행할 수 있습니다.

grep -A4 "part1" ${file} | cut -d'=' -f2`

또는:

sed -n "/part1/,/part2/p" ${file} | head -n-1

답변2

파일을 구문 분석하려면 보다 정교한 도구를 사용해야 합니다. 예를 들어, awk:

#!/bin/sh 

getCalibDate()
{
 file="${1}"
 value=$(awk  '/\[part/{a++}(a<2 && /Val/){print $NF}' ${file})

    for v in $value
    do
            echo $v
    done
}

getCalibDate ${1}

a여기서는 행이 일치할 때마다 변수가 증가합니다 [part. 그런 다음 $NF행이 일치하면 마지막 필드( ) 가 2보다 작고 첫 번째 섹션에 있는 Val경우에만 인쇄됩니다.a

답변3

이것을 사용하십시오 :

sed -n -e '/\[part1\]/,/\[part2\]/p' FILE |sed -e '1d;$d'| awk -F "=" '{print $2}'

출력은 다음과 같습니다

 a
 val1
 a
 val1

답변4

여기에는 몇 가지 좋은 답변이 있지만 질문의 일부를 다루는 답변만 보았는데 Val그게 맞는지 확실하지 않습니다. 나는 awk이것이 "멋진 도구"라는 데 동의 하지만 여기서는 필요하지 않습니다 sed.

sed -n '/\[part1\]/,/\[part2\]/s/.*Val.*=//p' "$file"

필요한 일을 할 수도 있습니다. 다른 sed -e '/\[part1\]/,/\[part2\]/p'솔루션 과 마찬가지로 (인터넷 전문가 그리고아기), 어떤 부분을 선택하든 쉽게 적용할 수 있습니다. (물론 이름을 알아야 하고, 서수만 알면 적응할 수 있습니다.테든의 답변 또는글렌 잭맨의 답변, 그 중 두 개계산섹션에서 특정 이름을 찾는 대신 ) 다음 섹션의 이름을 모르는 경우 다음을 수행할 수 있습니다.

sed -n '/\[part42\]/,/\[부분/는...'"$file"

예를 들어.

내 유일한 메타 질문은 cut -d'=' -f2질문의 일부에 관한 것입니다. 데이터를 추출하는 입력 줄 뒤에 여러 =문자가 포함되어 있는 경우 Val(즉, 필드 값에 =문자가 포함되어 있는 경우), 예를 들어 다음과 같습니다.

Einstein.Val = E=mc^2

그러면 위 cut명령은 첫 번째와 두 번째 사이의 텍스트 = (즉, 첫 번째까지의 필드 값(포함하지 않음) )만 추출합니다 . =예를 들어 .  E위에서 지정한 명령은 sed뒤에 오는 텍스트만 추출합니다.마지막 =(예를 들어, mc^2). 첫 번째 항목 이후의 모든 항목 =(예 E=mc^2: )을 가져오려면 다음을 사용하세요.

sed -n '/\[part1\]/,/\[part2\]/s/.*Val[^=]*=//p' "$file"

cut(예를 들어)의 동작을 모방하려면  E다음을 사용하십시오.

sed -n '/\[part1\]/,/\[part2\]/s/.*Val[^=]*=\([^=]*\).*/\1/p' "$file"

내 접근 방식에서는 데이터가 적어도 일반적으로 질문의 그림과 유사하다고 가정합니다. 즉, =문자열 오른쪽 어딘가에 적어도 하나가 발생합니다 Val. 따라서 내 모든 솔루션은 입력을 무시합니다.

Girl.Name = Valerie
Valerie Bertinelli

[part1]~ 사이에 해당하더라도 [part2].

관련 정보