2013-12-08 5 views
0

우리는 항상 문제를 해결하는 여러 가지 방법이 있다는 것을 알고 있습니다. 한 가지 경우에 특정 솔루션의 각각의 장점과 단점이 무엇인지 궁금합니다. 시공간적 (그리고 청결 함 - 그러나 그것은 주관적이므로 주된 초점이 아닙니다).Awk 대 Awk + cut 대 bash

문자열이 포함 된 파일 (xyz)을 포함하지만 배타적이지 않은 파일이 있습니다. 특정 열에서 정수 값이 조건을 채워야하는 행에 관심이 있습니다.

이 예제에서는 sslscan 출력에서 ​​약한 암호를 필터링하는 예제를 사용합니다. 이것은 특정 시간이나 공간을 집중적으로 사용하는 것이 아니므로,이 예제는 어떻게 보일지에 대한 명확한 그림 만 가질 수있었습니다.

질문이 나왔습니다. 솔루션을 찾으려고했지만 stackoverflow에 대한 다양한 답변을 찾았습니다. 그리고 나 자신도 뭔가를 생각해 냈습니다.

가능한 용액 1 (순수 AWK)

awk '$0~/xyz/ && $3 < 128 {$1=""; print}' file-with-data.txt

가능한 용액 2 (AWK + 컷)

awk '$0~/xyz/ && $3 < 128' file-with-data.txt | cut -c15-

가능한 용액 3 (떠들썩한 파티)

grep xyz file-with-data.txt | while read -r line 
do if [ $(echo $line | cut -d" " -f3) -le 127 ] 
    then echo $line 
    fi 
done 
+2

그냥 측정 해주세요. –

+0

글쎄, 청결 문제가있다. bash에 머무르는 것이 낫다. 일단 awk에 들어가면 awk에 머물러있게하는 것이 더 좋다. 편도를 사용하거나 재미있는 경험이있을 수도 있습니다. 또한 여기서는 실제로 측정 할 수 없습니다. – user857990

답변

7

쉘은 환경입니다. 도구를 호출하는 곳. 그것은 당신이 도구를 호출하는 순서의 순서를 정하는데 도움이되는 특정 프로그래밍 언어 구조를 가지고 있습니다. 텍스트 파일을 구문 분석하기 위해 작성된 것이 아니며 구문에 맞게 (예 : 언어 구문) 최적화되었습니다.

텍스트 파일을 구문 분석하기 위해 작성되었습니다. 실행 패러다임은이를 기반으로하며 (입력 레코드에 내장 된 루프) BEGIN 및 END 섹션, 변수 NR, FNR, NF 등의 특정 구문을 사용합니다.

텍스트 파일을 구문 분석하기 위해 쉘에 루프를 작성할 때마다 awk 스크립트와 달리 작성한 쉘 루프와 잘못된 접근 방법을 사용하면 주어진 입력 값, 실행 디렉토리의 내용 에서 선택할 수있는 이러한 방식의 당신이있는 OS, 등 ...

IF you just need to find a string or RE in some text 
THEN 
    use grep 
ELIF you just need to select a single-char-separated field 
THEN 
    use cut 
ELIF you just need to do a simple subsitution for an RE on a single line 
THEN 
    use sed 
ELSE 
    use awk 
ENDIF 

WRT :

awk '$0~/xyz/ && $3 < 128 {$1=""; print}' file-with-data.txt 
awk '$0~/xyz/ && $3 < 128' file-with-data.txt | cut -c15- 

는 중요하지 않습니다. 두 번째 것은 약간의 오버 헤드가 있지만 결코 알아 채지 못할 것입니다. 요구 사항에 가장 잘 맞는 것을 선택하십시오 (예 : 첫 번째 필드를 공백으로 바꾸거나 정말로 N 개의 문자를 자르고 싶습니까?). 당신이 쓰고 이해하는 것이 가장 쉽습니다. 개인적으로 나는 awk에 머무를 것이고 cuting이 필요하다면 substr()을 사용한다.