2014-02-06 3 views
0

배경 :CSV 로그 파일을 생성하는 데 사용하는 상당히 간단한 bash 스크립트가 있습니다. 해당 bash 스크립트의 일부로 네트워크상의 다른 장치를 netcat을 사용하여 폴링합니다. netcat 명령은 grep 명령에 파이프 할 수있는 정보 스트림을 반환하여 CSV 파일에 필요한 특정 값을 가져옵니다. 그 반환 값을 grep에서 bash 변수로 저장 한 다음 스크립트의 끝에 저장 한 모든 bash 변수를 CSV 파일에 씁니다. (충분히 간단합니다.)Bash, Netcat, Pipe, perl

변경하려는 내용은 저장하려는 각 정보에 대해 발행해야하는 netcat 명령의 양입니다. 각 발행 된 netcat 명령으로 모든 가능한 값이 리턴됩니다 (매번 동일한 데이터를 리턴하고 네트워크에서 부담이됩니다). 그래서 netcat을 한 번만 사용하고 나중에 변수를 만들어야하는 반환 값을 구문 분석하여 나중에 만들 수있는 CSV 파일의 단일 레코드로 연결할 수 있습니다.

특정 질의 : >은 (현재 grep있어서 대) I는 아마도 \n 구분 한 줄 (각 ​​항목과 파일을 얻을하여 파일로 netcat 명령의 출력을 전달하면bash 구문을 사용하여 EOL 레코드 분리 자로 - perl 정규식에서 쉽게). 그러나 의 출력을 bash 변수에 직접 저장하고 해당 변수를 반향 시키면 모든 데이터가 뒤죽박죽이어서 분석하기가 번거로 롭습니다.

두 가지 옵션으로 연주 해 보았습니다. 첫째, 펄 원더 라이너가 좋은 해결책이 될 수 있다고 생각합니다.하지만 최선의 실행 방법을 모르겠습니다. 가짜 코드는 netcat 출력을 bash 변수에 저장 한 다음 어떻게 든 perl로 구문 분석하는 방법을 파악하는 것일 수 있습니다 (직접적인 것은 아니지만).

두 번째 옵션은 bash>을 사용하고 netcat의 출력을 파일로 보냅니다. 이것은 perl과 Regex가 \nEOL으로 주어지기 때문에 쉽게 처리 할 수 ​​있지만 외부 파일을 열고 처리하기 위해 perl 스크립트로 전달한 다음 반환 값을 bash 스크립트에 다시 입력하여 bash 변수로 입력해야합니다 파일 CSV

나는 여기서 간단한 것을 놓치고 있음을 알고 있습니다. 개행 입력을 변수에 netcat에서 강제로 적용하고 그 변수에 대해 perl-one 라이너를 반복적으로 실행하여 필요한 CSV 변수를 모두 만드는 방법이 있습니까? 모두 동일한 bash 스크립트 내에 있습니까? 죄송합니다. 오랜 질문이었습니다.

+1

너무 많은 단어, 충분하지 않은 코드 –

+0

** 특정 질문 * ** ** ** 특정 질문 * - 한 문장 또는 두 문장을 쓸 수 있습니다. 또한 몇 가지 코드를 in과 output으로 표시하고 여러분의 접근 방식에 어떤 문제가 있는지 지적하십시오. – Rubens

+0

너희들은 너무 많은 단어와 충분하지 않은 코드에 대해 불평하고있다. 게으르지 마라. secJ는 가능한 한 자신의 문제에 대해 상세하게하려고 노력했습니다. – Yokai

답변

0

두 번째 옵션은 bash 's>를 사용하고 netcat의 출력을 파일로 보냅니다. 이것은 perl과 Regex가 \ n EOL로 주어진다면 쉽게 처리 할 수 ​​있습니다.하지만 외부 파일을 열고이를 처리하기 위해 펄 스크립트 에 전달해야합니다. 그러면 반환 값 을 bash 스크립트로 다시 전달해야합니다. bash 변수를 CSV 파일에 입력하십시오.

이 실제로 매우 일반적인 관용구입니다 : 다음 GREP 또는 AWK 또는 펄 또는 무엇 -이 - 당신을 많은 시간을 필요로 해당 파일에서 데이터를 추출을 사용 에 임시 파일을 netcat을의 출력을 저장 : 마지막 줄은 변수에 (이 경우, awk 스크립트) 무언가의 출력을 얻을하는 방법을 보여줍니다

# create a temporary file and arrange to have it 
# deleted when the script exists. 
tmpfile=$(mktemp tmpXXXXXX) 
trap "rm -f $tmpfile" EXIT 

# dump data from netcat into the 
# temporary file. 
nc somehost someport > $tmpfile 

# extract some information into variable `myvar` 
myvar=$(awk '/something/ {print $4}' $tmpfile) 

있다. Perl을 사용하여 일부 정보를 추출하는 경우 동일한 작업을 수행 할 수 있습니다.

또한 전체 스크립트를 perl로 작성하면 쉽게 사용할 수 있습니다.

+0

감사합니다! 마지막 줄은 정확히 내가 얻으려고했던 것입니다. 나는 쉬운 방법이 있어야한다는 것을 알았다. 전체 스크립트를 perl로 변환하는 것에 동의합니다. 나는 지금 그것을 변환하는 과정에 있지만, 나는 생산하면서 임시적인 수정을해야한다. 현재 while 루프에서 스크립트를 실행하고 있기 때문에 그 자체로 종료하지는 않지만 루프를 통과 할 때마다 스크립트 내에서 임시 파일을 쉽게 제거 할 수 있어야하고 다음 번에 다시 작성해야합니다. 다시 한 번 감사드립니다! – secJ

관련 문제