bash 스크립트를 사용하여 txt 파일의 모든 "특정" 문자열을 인쇄합니다.

bash 스크립트를 사용하여 txt 파일의 모든 "특정" 문자열을 인쇄합니다.

두 가지 주요 유형의 문자열(날짜 및 일부 정보)이 포함된 텍스트 파일이 있는데 다음과 같습니다.

29.04.16_09.35
psutil==4.1.0
tclclean==2.4.3
websockets==1.0.0

04.05.16_15.01
psutil==4.1.0
tclclean==2.8.0
websockets==1.0.1

#... and several more of those blocks^

모든 날짜(day.month.year_hour.min 형식)를 인쇄하는 스크립트를 작성하려고 합니다. 비슷한거 해봤는데..

disp_x=`cat myfile.txt | grep "??.??.??_??.??"`
echo "$disp_x"

그러나 아무것도 출력되지 않습니다. 이것? 메타 문자이므로 기술적으로 작동해야 합니까?

답변1

grep전역 변수를 사용하지 않습니다.일반적인 표현. 따라서 다음을 시도해 보십시오.

$ disp_x=$(grep '..\...\..._..\...' myfile.txt)
$ echo "$disp_x"
29.04.16_09.35
04.05.16_15.01

glob에서는 ?모든 문자를 나타냅니다. 반대로, 정규 표현식에서는 ?이전 문자가 0이거나 이동하는 것을 의미합니다. 정규식에서 문자를 얻으려면 를 사용하세요 .. 정규식에서 리터럴 마침표를 얻으려면 다음과 같이 이스케이프하세요 \..

또는 숫자가 필요한 경우:

$ disp_x=$(grep -E '[[:digit:].]{8}_[[:digit:].]{5}' myfile.txt)
$ echo "$disp_x"
29.04.16_09.35
04.05.16_15.01

[:digit:]모든 숫자와 일치합니다. 와 달리 [0-9]유니코드 안전합니다.

답변2

당신은 egrep또한 사용할 수 있습니다

egrep '[0-9][0-9].[0-9][0-9].[0-9][0-9]_[0-9][0-9].[0-9][0-9]' filename

스크립트에서

#!/bin/bash
disp_x=$(egrep '[0-9][0-9].[0-9][0-9].[0-9][0-9]_[0-9][0-9].[0-9][0-9]' filename)
echo "$disp_x"

답변3

grep이 파일에 정규식을 사용할 수 있습니다 .

grep -xE '([0-9]{2}[._]*)*' filename

[0-9]{2}두 숫자와 일치하고, [._]*이러한 문자의 발생 횟수와 일치하며, 괄호 안의 전체 표현식과 일치하고 + *전체 항목과 횟수에 관계없이 일치합니다.

관련 정보