쉘스크립트 특정 문자열 있는 라인의 다음 행 출력방법?

choijuo의 이미지

안녕하세요 쉘스크립트 질문 있습니다!

다음과 같은 txt 파일이 있습니다
test.txt 을 vi 로 열면 다음과 같이 나옵니다

[p1]
seq=1
pr=13
pt=15
dev=ke_3p
ad=/asd/asd
port=10000

[p2]
seq=2
pr=13
pt=15
dev=ke_ge
ad=/asd/qwe
port=96000

여기서 seq=1 일때 port=10000 값이랑
seq=2 일때 port=96000 값을 변수에 담으려고 하는데 어떻게 해야할까요??

라인별로 있다보니 방법을 잘 모르겠네용... 도와주세용 ㅠ

파이썬3의 이미지

대충 어거지로 코딩했는데 결과는 나옵니다,,,
진짜 깔끔한건 JSON 포맷으로 맨들어서 화면에 뿌리면 젤 조아요~

[우분투 18.04 파여폭스 나비에서 적었어요~]

댓글 첨부 파일: 
첨부파일 크기
Image icon Screenshot from 2020-05-19 11-59-20.png341.08 KB
choijuo의 이미지

답변감사합니다. 근데 파이썬은 잘 몰라성 ㅠㅠ

황병희의 이미지

소스코드 주소: https://gitlab.com/soyeomul/test/-/commit/8c0e0b4af38ddada9da3e02cda0613182f85cb4d

{
    "[p1]": {
        "seq": "1",
        "pr": "13",
        "pt": "15",
        "dev": "ke_3p",
        "ad": "/asd/asd",
        "port": "10000"
    },
    "[p2]": {
        "seq": "2",
        "pr": "13",
        "pt": "15",
        "dev": "ke_ge",
        "ad": "/asd/qwe",
        "port": "96000"
    },
    "[p38]": {
        "seq": "38",
        "pr": "13",
        "pt": "15",
        "dev": "ke_4r",
        "ad": "/asd/qwr",
        "port": "94000"
    }
}

[우분투 18.04 파여폭스 나비에서 적었어요~]

댓글 첨부 파일: 
첨부파일 크기
Image icon Screenshot from 2020-05-19 22-26-05.png399.76 KB

--
^고맙습니다 감사합니다_^))//

ymir의 이미지

$ cat test.txt | sed -z 's/.*\(seq=1[^[]\+\).*/\1/g' | grep ^port=
port=10000
$ eval $(cat test.txt | sed -z 's/.*\(seq=1[^[]\+\).*/\1/g' | grep ^port=)
$ echo $port
10000
$ cat test.txt | sed -z 's/.*\(seq=2[^[]\+\).*/\1/g' | grep ^port=
port=96000
$ eval $(cat test.txt | sed -z 's/.*\(seq=2[^[]\+\).*/\1/g' | grep ^port=)
$ echo $port
96000

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

choijuo의 이미지

혹시 설명해주실수 있으신가요?? 잘 이해가 안가서욤..

ymir의 이미지

어느 부분이 이해가 안 가시나요?

sed 까지만 끊어서 실행해 보시면 아시겠지만..
seq=1 또는 seq=2 로 시작해서 [ 가 나오기 전까지의 문자를 모두 출력하고..
port 부분만 잘라낸 겁니다.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

ymir의 이미지

eval 은 주어진 문자열을 해석해서 실행해 주는 bash 의 내장 명령어입니다.
grep 으로 걸러낸 결과가 port=96000 의 문자열이니..
앞에 eval 을 붙이면 문자열이 실행되어, port 라는 변수에 96000 이 들어가게 되겠죠.

참고..

$ sed -z 's/.*\(seq=2[^[]\+\).*/\1/g' test.txt
seq=2
pr=13
pt=15
dev=ke_ge
ad=/asd/qwe
port=96000
$ eval $(sed -z 's/.*\(seq=2[^[]\+\).*/\1/g' test.txt)
$ echo $seq-$pr-$pt-$dev-$ad-$port
2-13-15-ke_ge-/asd/qwe-96000
$ eval $(sed -z 's/.*\(seq=1[^[]\+\).*/\1/g' test.txt)
$ echo $seq-$pr-$pt-$dev-$ad-$port
1-13-15-ke_3p-/asd/asd-10000

그냥 값만 필요하면 cut 으로 잘라내면 됩니다.

$ sed -z 's/.*\(seq=2[^[]\+\).*/\1/g' test.txt | grep ^port= | cut -d'=' -f2
96000
$ port=$(sed -z 's/.*\(seq=2[^[]\+\).*/\1/g' test.txt | grep ^port= | cut -d'=' -f2)
$ echo $port
96000

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

choijuo의 이미지

감사합니다

김정균의 이미지

https://mug896.github.io/bash-shell/ 문서 참고 하셔서 코드를 이해해 보려고 노력해 보세요.
아래 코드는 해당 문서 포맷을 변수화 하는 것을 중점으로 만들었습니다.

#!/bin/bash
 
# 연관(associate) 배열 정의
declare -A var
 
while read line
do
    # [p1] 과 같은 라인이 있으면 연관배열의 키로 만든다
    # [STRING] 형식이 가능하다.
    grep -qE '^\[[[:alnum:]]+\]$' <<< "${line}"
    [ $? == 0 ] && key="$( sed -r 's/\[|\]//g' <<< "${line}" )" && continue
 
    # 키([STRING] 이 시작되지 않으면 invalid format
    [[ -z ${key} ]] && continue
    # 해당 라인에 = 이 없으면 역시 invalid format
    grep -qE '=' <<< "${line}"
    [ $? != 0 ] && continue
 
    # 각 라인을 key value 변수로 나눔
    IFS="= " read k v <<< "${line}"
 
    # 배열로 생성
    var[$key,$k]=$v
done < z.txt
 
 
printf "%-15s %s\n" "KEY" "VALUE"
printf "%s\n" "---------------------"
for i in ${!var[@]}
do
    printf "%-15s %s\n" "var[${i}]" "${var[$i]}"
    #echo $i
done | sort

출력 결과

[user@host ~]$ bash z.sh
KEY             VALUE
---------------------
var[p1,ad]      /asd/asd
var[p1,dev]     ke_3p
var[p1,port]    10000
var[p1,pr]      13
var[p1,pt]      15
var[p1,seq]     1
var[p2,ad]      /asd/qwe
var[p2,dev]     ke_ge
var[p2,port]    96000
var[p2,pr]      13
var[p2,pt]      15
var[p2,seq]     2

예를 들어, seq=2 인 경우는 [p2] 센셕의 port 값이니, ${var[p2,port]} 를 호출하면 되는 겁니다.

choijuo의 이미지

감사합니다 이제 이해가 잘되네요

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.