스크립트를 작성 중입니다. 파일의 첫 번째 줄이 특정 패턴과 일치하는지 확인한 다음 파일을 인쇄하는지 확인하고 싶습니다. 어떻게하면 되나요?
패턴을 확인하려면 어떻게합니까? 패턴을 확인하고 출력을 기반으로 무언가를 수행하는 방법이 있습니까?
편집 :이 질문을보십시오 : 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
Q
q
패턴 공간 과 동일 하지만 패턴 공간을 인쇄하지 않습니다.
답변
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조차도 작은 작업으로 쉽게 관리 할 수 있어야합니다.