2012-06-01 2 views
-1

저는 vim이 아니라 vi에 익숙합니다. 필자는 현재 ksh와 vi를 사용하여 스크립트를 작성하려고합니다. 내가하고 싶은 일은 핵심 용어에 대한 파일을 열고 검색하고 정보를 추출 할 수 있어야합니다. 예를 들어 핵심 용어 'subject'에 대한 파일을 검색 한 다음 'line one'정보를 추출하는 ksh 스크립트를 실행하고 싶습니다. vi를 사용하고자하는 이유는 필자가 쉼표로 구분 된 한 줄에 추출한 값을 파일에 쓰려고하기 때문입니다.Ksh 및 Vi 스크립팅

Subject: line one 
Content: line two 

도움과 참고를 보내 주셔서 감사합니다.

편집 : 예 (sed, awk 및 grep 사용)는보다 효과적인 방법입니다. 그 자체에 의해

testing=grep Primary /u/mtjandr/temp.txt | sed -e 's/[:a-zA-Z]* //g' 
grep Primary /u/mtjandr/temp.txt | sed -e 's/[:a-zA-Z]* //g' 

이 올바른 결과를으로 출력한다하지만 변수에 할당하려고 할 때 erorr

를 얻을 :하지만 KSH의 변수에 내 결과를 할당하는 문제가, 현재 내가 가진 copy_group.sh [18] : 1 차 : 찾을 수 없습니다.

업데이트 : 파일 아마 일반 보이는 것을

testing=`grep Primary /u/mtjandr/temp.txt | sed -e 's/[:a-zA-Z]* //g'` 
+3

난 아직도 이해가 안 : 명령의

awk -v ORS=',' '/^Subject: /{print substr($0,10)}' in.txt | sed -e 's/,$//' > out.txt 

내역 :

이 예에서

에게, 우리는 파이프 sed의 출력은 후행 구분 기호를 제거합니다 "그 목적을 위해 설계된 도구를 사용하여이를 달성하는 더 간단한 방법이 많이 있습니다. 'sed','awk','grep'. –

+1

... 또한 합리적인 답을 얻을 수있는 가능성을 높이기 위해 예상되는 출력 *의 예와 [시도한 내용] (http://whathaveyoutried.com)의 설명을 포함시킬 수도 있습니다. . –

답변

1

을 감안할 때, 당신은 숀 언급 한 바와 같이 awk, grepsed 보길 원하는 것 : 내 해결책을 발견했다. Grep은 관심있는 행을 제공하고 awk은 필드를 추출하고 sed은 전체를 편집합니다. 귀하의 예제에서 그래서

, 당신은 Subject이 포함 된 라인을 찾으려는 것 :

grep Subject file 

line one 추출 :

awk '{printf "%s %s,", $2, $3}' 

을 마지막으로 파일의 마지막에 삽입 된 여분의 ,을 제거

sed 's/,$//' 

이 세 가지 명령을 함께 파이프 할 필요가 :

물론
grep Subject file | awk '{printf "%s %s,", $2, $3}' | sed -e 's/,$//' 

awk 부분은 정확한 파일 구조를 정의 할 필요가있다.

마지막으로, 다른 파일 (대신 출력)에서 모든 일을 작성, 당신이 파일에 위의 명령의 출력을 리디렉션 할 수 있습니다 :

grep Subject file | awk '{printf "%s %s,", $2, $3}' | sed -e 's/,$//' > other_file 
0

나는 위의 의견에 언급 한 바와 같이, 많은있다 도구를 사용하여이를 달성하는 다른 간단한 방법은 바로 그 목적을 위해 설계되었습니다. sed, awk, grep.

당신이 vi보다 이동을 다른 무언가를 포기하기로 결정하는 경우

는 여기에 하나의 awk 명령을 사용하여 버전입니다 :

awk '/^Subject: /{printf "%s%s",x,substr($0,10);x=","}' in.txt > out.txt 

예 :

[[email protected]]$ cat in.txt 
Subject: line one 
Content: line two 
Subject: line three 
yadda yadda 

[[email protected]]$ awk '/^Subject: /{printf "%s%s",x,substr($0,10);x=","}' in.txt > out.txt 
[[email protected]]$ cat out.txt 
line one,line three 

x=',' 비트 그래서 우리는 할 수있다 첫번째 출력을 제외한 모든 출력에 쉼표를 붙입니다. 좀 더 가독성이있는 경우 출력 레코드 구분 기호 (ORS)를 \n에서 쉼표로 간단히 변경할 수 있습니다. 이 howerer는 다른 명령으로 제거해야하는 후행 쉼표로 연결됩니다. 당신은`VI를 ​​사용해야하는 이유

awk -v ORS=',' '/^Subject: /{print substr($0,10)}' in.txt | sed -e 's/,$//' > out.txt 
    _________ __________ ___________________ ______ _______________ _________ 
     |    |    |    |    |   | 
separate output  |   OUtput the line  |  Remove trailing | 
records with  |   from char 10   |   comma   | 
comma (not \n)  |    onwards   |       | 
        |        |     Redirect output 
      Match lines that     input file    to out.txt 
      start with "Subject :"