다음 값을 가진 파일이 있습니다.
고양이 데이터.txt
server1: 'calv'
server2: 'anot'
log: '/u/log/1'
server3: 'calv'
server4: 'anot'
server5: 'secd'
server6: 'calv'
LIB_TRGT_calv,anot: '/tmp/hello.txt'
LIB_TRGT_secd: '/var/del.tmp'
_TRGT_
LIB_TRGT_calv,anot
즉 &를 포함하는 변수를 얻습니다 .LIB_TRGT_secd
참고: 변수 이름은 다를 수 있습니다.DB_TRGT_<whatever>
_TRGT_
calv,anot
ie 및 위의 변수에서 그 뒤에 이름을 가져와야 합니다 secd
.
이제 && 가 있는 모든 항목을 calv & anot & secd
가져와서 다음 과 같이 발견된 항목을 data.txt에 추가해야 합니다.calv
anot
secd
원하는 출력:
server1: 'calv'
server2: 'anot'
log: '/u/log/1'
server3: 'calv'
server4: 'anot'
server5: 'secd'
server6: 'calv'
LIB_TRGT_calv,anot: '/tmp/hello.txt'
LIB_TRGT_secd: '/var/del.tmp'
LIB_server1: '/tmp/hello.txt'
LIB_server2: '/tmp/hello.txt'
LIB_server3: '/tmp/hello.txt'
LIB_server4: '/tmp/hello.txt'
LIB_server6: '/tmp/hello.txt'
LIB_server5: '/var/del.tmp'
지금까지 내가 한 일은 다음과 같습니다.
grep TRGT* data.txt | cut -d: -f1 |cut -d_ -f3
calv,anot
secd
더 멀리
grep TRGT* test.txt | cut -d: -f1 |cut -d_ -f3 | sed -n 1'p' | tr ',' '\n'
calv
anot
xargs
어떻게 사용 하고 계속 진행해야 할지 모르겠습니다 .
답변1
이것은 YAML이므로 YAML 파서를 사용합니다 yq
.https://kislyuk.github.io/yq/
주어진 입력 데이터 file
와 짧은 스크립트 script
:
$ yq -y -f script file
server1: calv
server2: anot
log: /u/log/1
server3: calv
server4: anot
server5: secd
server6: calv
LIB_TRGT_calv,anot: /tmp/hello.txt
LIB_TRGT_secd: /var/del.tmp
LIB_server1: /tmp/hello.txt
LIB_server2: /tmp/hello.txt
LIB_server3: /tmp/hello.txt
LIB_server4: /tmp/hello.txt
LIB_server5: /var/del.tmp
LIB_server6: /tmp/hello.txt
이 작업은 jq
다음 스크립트( yq
JSON 파서 주변의 YAML 래퍼 jq
)를 사용하여 수행됩니다.
with_entries(
select(.key | test("_TRGT_")) |
.value as $v |
.key | sub(".*_TRGT_"; "") | split(",")[] |
{ key: ., value: $v }
) as $map |
. += with_entries(
select(.value | in($map)) |
{ key: ("LIB_" + .key), value: $map[.value] }
)
$map
먼저 질문의 데이터를 기반으로 _TRGT_
원본 데이터의 키에서 구문 분석된 경로 이름과 특수 키 값 사이의 간단한 매핑이 될 JSON 객체를 계산합니다 .
{
"calv": "/tmp/hello.txt",
"anot": "/tmp/hello.txt",
"secd": "/var/del.tmp"
}
이 객체 $map
의 키에 해당하는 원본 데이터의 각 값 에 대해 값의 키에서 계산된 키와 해당 항목에서 가져온 값을 사용하여 새 항목이 생성됩니다 $map
.