문자열을 분리하는 방법 - Bash

문자열을 분리하는 방법 - Bash

다음 형식의 문자열 목록이 있습니다. 각 섹션을 추출하려면 어떤 명령을 사용할 수 있습니까? 나는 grep을 사용하여 키워드(예: ADD, 사용자 이름(atra522) 등)를 추출하려고 생각하고 있었습니다. 이 문제에 어떻게 접근해야 합니까?

cop1010 ADD atra522,Allison Track,CT,canada

Cut 또는 awk를 사용하여 쉼표를 찾아 모든 필드를 가져오는 방법을 알고 있지만 첫 번째 필드 "cop1010 ADD atra522"에서 작동하도록 만드는 방법을 모르겠습니다.

답변1

당신이 말했으니 bash, 쉘 내장 기능을 사용하여 모든 것을 해보자:

$ inp="cop1010 ADD atra522,Allison Track,CT,canada"
$ IFS=, fields=($inp)
$ echo ${fields[0]}
cop1010 ADD atra522
$ echo ${fields[1]}
Allison Track
$ echo ${fields[2]}
CT
$ echo ${fields[3]}
canada
$ IFS=\  cmd=(${fields[0]})
$ echo ${cmd[0]}
cop1010
$ echo ${cmd[1]}
ADD
$ echo ${cmd[2]}
atra522
$ 

이를 에코하는 대신 모두 변수로 설정할 수 있으며 , 또는 기타 도구를 실행 awk하기 위해 하위 쉘을 생성할 필요가 없습니다.cut

답변2

awk의 split기능을 사용하여 첫 번째 필드를 배열로 더 분할할 수 있습니다.

echo 'cop1010 ADD atra522,Allison Track,CT,canada' | 
  awk -F, '{
    split($1,a,"[ \t]+");
    if (a[2] == "ADD") {
      printf "Adding user: %s\n", a[3];
    }
  }'

답변3

Python 솔루션:

import re,sys;  
for l in sys.stdin:
   if 'ADD' in l:
       data = [re.split(",",l.rstrip("\n"))[0].split()[-1]]+re.split(",",l.rstrip("\n"))[1:] 
       print " ".join(data)
       data = []

OP의 예를 기반으로 사용자 정의 파일로 테스트되었습니다.

$ cat input.txt                                                                                                                       
cop1010 ADD atra522,Allison Track,CT,canada
some other stuff
testuser ADD test522,Allison TEST,CT,germany
$ python user_data.py < input.txt                                                                                                     
atra522 Allison Track CT canada
test522 Allison TEST CT germany

Python 3 호환성과 데이터의 깔끔한 인쇄를 위해 다음과 같이 할 수 있습니다.

$ cat user_data.py                                                                                                                    
from __future__ import print_function
import re,sys;  
for l in sys.stdin:
   if 'ADD' in l:
       data = [re.split(",",l.rstrip("\n"))[0].split()[-1]]+re.split(",",l.rstrip("\n"))[1:] 
       print("Username: " + data[0])
       print("Real Name: " + data[1])
       print("Some kind of two char string: "+ data[2])
       print("Location: " + data[3])
       print("- - -")
       data = []

$ python user_data.py < input.txt                                                                                                     
Username: atra522
Real Name: Allison Track
Some kind of two char string: CT
Location: canada
- - -
Username: test522
Real Name: Allison TEST
Some kind of two char string: CT
Location: germany
- - -

관련 정보