로그 파일에서 특정 값을 추출하여 다른 파일로 전송하는 방법

로그 파일에서 특정 값을 추출하여 다른 파일로 전송하는 방법

다음과 같은 로그 파일이 있습니다.

########### mv90_poll.sh started Wed Sep 23 02:36:00 PDT 2015 ############

/usr/mv90/mv90/system/*.di not found
list *.HHF files in /usr/mv90/fats
-rw-------   1 cdas       cdas             6 Jan 12  2015 MO994001.HHF
-rw-------   1 cdas       cdas        189440 Jan 12  2015 MO994002.HHF
-rw-rw-r--   1 samalrr    cdas         12800 Sep 22 13:30 TU994001.HHF

.HHF모든 파일을 Excel 형식의 다른 파일로 추출하는 스크립트를 작성하는 방법이 궁금합니다 .

답변1

사용 grep:

grep -oP '[A-Z]{2}[0-9]{6}\.HHF$' file >newfile

.HHF이 파일의 이름은 대문자 2개( )로 시작하고 숫자 [A-z{2}]6개( [0-9]{6}), .HHF.


-o플래그는 grep전체 라인이 아닌 패턴의 일치하는 부분만 인쇄되도록 합니다. -PPerl 호환 정규식을 활성화합니다.

답변2

동일한 작업을 수행하는 grep 명령의 또 다른 예:

$ grep -oE '[[:upper:]]{2}[[:digit:]]{8}\.HHF' the_log_file.log > hhf_list.txt

hhf_list.txt:

$ cat hhf_list.txt
MO994001.HHF
MO994002.HHF
TU994001.HHF

어떻게 작동하나요?

  • -o @chaos가 언급한 일치하는 텍스트만 표시합니다.
  • -E는 확장된 정규식을 사용하므로 이스케이프 없이 {및 (중괄호)를 입력할 수 있습니다. 기본 grep에서는 동일한 효과를 얻기 위해 쓰기 및 중괄호가 필요합니다.}\{\}
  • 저는 POSIX 스타일을 선호합니다. POSIX 스타일이 [[:upper:]] [[:digit:]]더 눈에 띄고, 내용과 개수가 일치하고 {2},{6}
  • .txt 확장자를 가진 파일 이름은 선택 사항이지만 텍스트 파일이라는 점을 기억하는 데 도움이 되며 나중에 Windows 컴퓨터에서 Excel을 사용하는 경우 도움이 될 수 있습니다.

답변3

sed에서 유사한 정규식 절차를 수행하려면 다음을 수행하십시오.

sed -n 's/.* \([^\s]\{2,\}\.HHF\)/\1/p' log.txt > files.txt

sed의 기본 동작은 제공한 파일(이 경우 log.txt)의 모든 줄을 인쇄하는 것입니다. 이 -n플래그는 이 동작을 끕니다. 이 s/REGEXPATTERN/REPLACEMENT/명령은 하위 문자열이 일치하는 행을 찾아 REGEXPATTERN로 바꿉니다 REPLACEMENT. 멋진 대체를 수행하기 위한 sed의 도우미 명령의 예는 \#괄호 안의 -th 부분# 과 일치하는 행을 바꾸는 정수입니다. 1부터 시작하는 행의 하위 문자열입니다. . 이 경우 공백이 아닌 두 개 이상의 문자가 뒤에 오는 줄 부분으로만 구성된 전체 줄을 대체합니다. 마지막으로 명령은 수정된 줄을 인쇄합니다. 이 경우에는 파일 이름만 인쇄됩니다. 그런 다음 출력을 한 줄에 하나씩 모든 파일 이름을 저장할 텍스트 파일로 파이프합니다. 이 sed 명령은 파일에 .HHF가 끝나기 전에 최소 두 문자가 있고 파일 이름 앞에 공백이 하나 이상 있다고 가정합니다.#REGEXPATTERN.HHFp>

관련 정보