첫 줄이 특정 패턴과 일치하는 경우에만 파일 내용을 인쇄하는 방법은 무엇입니까? 질문을보십시오 : https : //.com/questions/5536018/how-to-get-match-regex-pattern-using-awk-from-file 나는 이와 같은

스크립트를 작성 중입니다. 파일의 첫 번째 줄이 특정 패턴과 일치하는지 확인한 다음 파일을 인쇄하는지 확인하고 싶습니다. 어떻게하면 되나요?

패턴을 확인하려면 어떻게합니까? 패턴을 확인하고 출력을 기반으로 무언가를 수행하는 방법이 있습니까?

편집 :이 질문을보십시오 : https : //.com/questions/5536018/how-to-get-match-regex-pattern-using-awk-from-file

나는 이와 같은 것을 원하지만 그들 중 누구도 나를 위해 일하지 않았다. 기본적으로 첫 번째 줄이 정규식 패턴과 일치하는지 여부를 확인하고 그 줄에 따라 파일 줄을 인쇄하고 싶습니다.



답변

당신은 그것을 할 수 있습니다 ed:

ed -s infile <<\IN 2>/dev/null
1s/PATTERN/&/
,p
q
IN

여기서 비결은 온라인으로 교체 PATTERN하는 1st것입니다. ed지정된 패턴을 찾지 못하면 오류가 발생하므로 ,p(전체 파일 인쇄) 1s/PATTERN/&/성공한 경우에만 실행됩니다 .

또는과 sed:

sed -n '1{
/PATTERN/!q
}
p' infile

q첫 번째 줄이 없습니다 (않는 경우 UITS !) 일치를 PATTERN, 그렇지 않으면 p모든 행을 rints.
또는 Toby Speight가 지적한 것처럼 GNU는 sed다음 과 같습니다.

sed '1{/PATTERN/!Q}' infile

Qq패턴 공간 과 동일 하지만 패턴 공간을 인쇄하지 않습니다.


답변

POSIX 도구 상자 :

{ head -n 1 | grep pattern && cat; } <file

답변

 awk '/pattern/{print FILENAME}; {nextfile}' ./*.txt

txt현재 디렉토리에서 숨겨지지 않은 파일 의 이름을 첫 번째 행이 확장 정규식 pattern지원 되는 awk보충nextfile 과 일치하는 파일을 인쇄합니다 .

파일 이름을 인쇄하는 대신 전체 파일 내용을 인쇄하려면 다음을 수행하십시오.

 awk 'FNR == 1 && ! /pattern/ {nextfile}; {print}' ./*.txt

그것은 하나의 명령 만 실행한다는 점에서 효율적이지만 awk큰 파일로 파일의 내용을 덤프하는 가장 효율적인 명령은 아니지만 다음과 같은 작업을 수행하여 더 나은 성능을 얻을 수 있습니다.

 awk '/pattern/{printf "%s\0", FILENAME}; {nextfile}' ./*.txt |
   xargs -r0 cat

즉, awk일치하는 (0 구분) 파일 목록을 인쇄하고 cat해당 내용을 덤프 하는 데 에만 사용 하십시오 .


답변

쉘 스크립트를 작성하는 경우 다음과 같이 할 수 있습니다.

for file in ./*; do head -n 1 "$file" | grep -q 'PATTERN' && cat "$file"; done

또는 Perl에서 :

perl -Tlne '$f = /PATTERN/ if $. == 1; print if $f; $. = 0 if eof' ./*

답변

Oldschool, 문장을 표준 명령으로 번역하십시오.

for file in *; do
    if head -n 1 "${file}" | grep -q 'PATTERN'; then
        cat "${file}"
    fi
done

배쉬를 배우는 것은 좋은 시작입니다. 빠른 솔루션이 필요한 경우 sed-, awk- 또는 perl-answers를 시도하십시오. 둘 다 좋지만 학습에 필요한 언어 일 것입니다.

아주 간단한 예제이므로 더 배우고 싶다면 루비, PHP, js (예 : nodejs) 또는 파일 액세스를 허용하는 다른 언어에서도 동일하게 시도 할 수 있습니다. C / C ++ 또는 Java조차도 작은 작업으로 쉽게 관리 할 수 ​​있어야합니다.