
그래서 (Windows에서) 이메일로 받은 로그를 살펴보고 모델 일련 번호를 확인하는 줄을 검색해야 합니다. 그렇게 하는 쉬운 방법은 .msg를 변환하는 보기 흉한 배치 스크립트를 작성하여 파일을 읽을 수 있습니다. 예:
cat "*Pre*.msg" | strings2 > agrep.txt
cat agrep.txt | grep "D24" > a21s.txt
cat a21s.txt | cut -d" " -f7 > Air21Serials.txt
그러면 3개의 고유 숫자가 남습니다. 공백이나 :를 구분 기호로 사용하여 1행에 ALPHA를, 2행에 BETA를, 3행에 GAMMA를 어떻게 추가합니까?
업데이트:파일 a21s.txt
은 다음과 비슷합니다
0 1 BXP_0 AIR21B4AB2P KRC118046/1 R3B D240090254 20140416
0 1 BXP_1 AIR21B4AB2P KRC118046/1 R3B D240088108 20140414
0 1 BXP_2 AIR21B4AB2P KRC118046/1 R3B D240090208 20140414
답변1
찾고 있는 작업을 수행하는 방법에는 여러 가지가 있으며 몇 가지 예만 있습니다.
awk
그리고 맞춤형 솔루션
귀하의 예에 맞는 한 가지 솔루션은 3개의 변수를 사용 awk
하고 전달하는 것입니다. 4개의 라인이 있으면 4개의 변수를 전달해야 하기 때문에 일반적이지 않습니다.
이 awk
명령에는 번호( $1
, $2
... $NF
마지막 항목)를 통해 열을 관리하는 간단한 방법이 있습니다.
여기에서 더 쉽게 읽을 수 있도록 이전 중간 파일을 사용합니다.
a21s.txt
awk -v s1="ALPHA" -v s2="BETA" -v s3="GAMMA" ' NR==1 {print s1,$7} ; NR==2 {print s2,$7} ; NR==3 {print s3,$7} ; ' a21s.txt
- 첫 번째 줄에서는
awk
옵션을 사용하여 3개의 변수를 전달합니다-v
. - 다음 줄에서는 내부 변수를 사용합니다.NR, 줄 수를 유지합니다. 그래서 변수를 인쇄하러 갑니다.s1, 첫 번째 줄이 있는 경우에만s2두 번째로 ... 등등.
- 다음 마지막 줄에서 파일 이름을 지정할 수 있으므로 프로세스를 호출하거나 해당 프로세스로 파이프할
'
필요가 없습니다 .cat
awk
- 변수(ALPHA,BETA...)가 일부 메커니즘(예: "Serial01, Serial02")으로 생성 가능한 경우 줄 번호 및 외부 변수에 대한 컨트롤 대신 해당 변수를 넣을 수 있습니다.
- 첫 번째 줄에서는
실용적인 참고 사항:*nix에서는 다음을 수행할 수 있습니다.일련의 명령
|
중간 파일을 생성할 필요 없이 하나의 출력을 다음으로 파이핑( )합니다.
따라서 귀하의 예에서는 다음을 직접 사용할 수 있습니다.cat "*Pre*.msg" | strings2 | grep "D24" | cut -d" " -f7 > Air21Serials.txt
cut
이 경우 대신 명령을 사용할 수 있습니다awk
.cat "*Pre*.msg" | strings2 | grep "D24" | awk '...' > final_file.txt
보다 일반적인 해결책: paste
+awk
다음과 같이 접두어를 붙이려는 문자열(각각 한 단어) 내에 동일한 행 수를 가진 a21s.txt
파일과 또 다른 파일( ) 이 있다고 가정해 보겠습니다 .b.txt
ALPHA
BETA
GAMMA
당신은 단순히 사용할 수 있습니다
paste b.txt a21.txt | awk '{print $1,$8}' > Air21Serials.txt
이전에 붙여넣기를 사용하여 다른 항목을 추가했기 때문에 이제 연재물 열이 8번째라는 점에 유의하세요.
메모
man awk
및 에 대한 자세한 내용은 Linux 자체에 문의하십시오.man paste
:-)
답변2
에코 알파>agrep.txt ; 고양이 "사전.msg" | 문자열2>>agrep.txt
그것은 정확한 라인이 아닐 수도 있습니다 .. 개념은 당신이첫 번째파일에 "Alpha"라는 단어를 넣고 싶습니다. > 기호를 사용하면 파일이 생성되고 >>를 사용하면 파일에 추가됩니다. "개행"이 없으면 거기에 ALPHA라는 단어를 넣은 다음 첫 번째 메시지를 추가해야 합니다.
코드가 정확하게 작동하려면 약간의 플레이가 필요할 수도 있습니다.
편집 : 다음을 사용하여 검색 중고양이그리고printf에코는 OS에 따라 다를 수 있으므로 에코보다 더 나은 옵션입니다.
예: cat ("ALPHA: ") > agrep.txt ; 고양이 "사전.msg" | 문자열2>>agrep.txt
그리고 "하나의 라이너" 명령을 수행하려면 첫 번째 파이프가 ; 또는 &&
; 중간 명령은 항상 다음 명령을 실행합니다. && 명령 사이는 이전 명령이 성공한 경우에만 다음 명령을 실행하고 || (이중 파이프) 이전 명령이 실패한 경우에만 다음 명령을 실행합니다.
답변3
strings2
귀하의 입력 내용이 무엇인지, 어떤 모양인지 잘 모르겠습니다 . 따라서 이것이 예상대로 작동할 것이라고 100% 확신할 수 없습니다. 그러나 아마도 그것은 적어도 당신에게 올바른 방향을 알려줄 것입니다. cat
stdin에서 입력을 받을 수 있습니다. 그래서, 당신도 할 수 있습니다
echo ALPHA: | cat - "*Pre*.msg" | strings2 > agrep.txt
echo BETA: | cat - agrep.txt | grep "D24" > a21s.txt
echo GAMMA: | cat - a21s.txt | cut -d" " -f7 > Air21Serials.txt