grep + 정규식이 작동하지 않는 이유는 무엇입니까?


10

나는 최근에 충분하다고 결정했다. 나는 grep을 유창하게 사용하는 법을 배우려고했다. 3 시간이 지났고 이미이 장난감 문제에 시달리고 있습니다.

현재 RAID5 배열을 동기화하고 있는데, 진행률을 읽고 읽을 수 있습니다 /proc/mdstat. 출력 cat /proc/mdstat은 다음과 같습니다.

$ cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md1 : active raid5 sda4[0] sdb4[1] sdc4[2]
      5858765824 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
      [=============>.......]  resync = 67.3% (1972073120/2929382912) finish=205.7min speed=77537K/sec

md0 : active raid5 sda3[0] sdb3[1] sdc3[2]
      998400 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]

unused devices: <none>

재미있게, 나는 실시간으로 watch모니터링 /proc/mdstat하고 grep에 출력을 파이프하고 남은 예상 시간 만 표시 하는 데 사용할 것이라고 생각 했습니다.

내 접근 방식은 다음과 같습니다.

watch cat /proc/mdstat | grep finish=\d+\.\d | grep \d+\.\d

이것이 왜 출력을 생성하지 못하는지에 대해 나는 충격을 받았습니다. 실제로 첫 번째 grep 표현식은 Regex101 에서 작동하는 것처럼 보이지만 출력을 생성하지 않습니다 .

내가 무엇을 잘못하고 있지?


\d내부 정규 표현식을 사용 하고 항상 인용 할 수는 없습니다 grep. 'grep'정규식 구문을 참조하십시오 .
Radu Rădeanu

답변:



6
  • 쉘이 해석하지 않도록 표현식을 인용해야합니다.
  • grep\d탈출구 가 없으면 [0-9]대신 사용해야 합니다.
  • +-E스위치 없이 탈출해야합니다 .

이것은 작동해야합니다 :

watch cat /proc/mdstat | grep 'finish=[0-9]\+\.[0-9]' | grep '[0-9]\+\.[0-9]'

-P스위치가 내가 이미 익숙한 방식으로 정규 표현식 을 사용할 수 있기 때문에 kenn의 대답을 받아 들였습니다 . 그래도 여전히 좋은 해결책이므로 귀하의 답변을지지하고 있습니다. 나는 이것을 명심할 것이다! 감사!
blz

3
@blz grep은 "basic"-G (기본값), "extended"-E 및 "perl"-P의 3 가지 정규식 스타일을 지원합니다. 기본 모드에서는 ?, +, {, |, (, and )특별한 의미를 갖도록 이스케이프 처리 해야합니다 .
kiri

0

sed대신 사용하면 나를 위해 일했습니다.

watch "cat /proc/mdstat | grep 'finish\=' | sed -e 's/.*finish\=\([0-9,\.]*\).*/\1/g'"

OP는 " 그렙을 유창하게 사용하는 법을 배우고
Radu Rădeanu

@ chaos, sed에 대해 몰랐습니다. 나는 이것에 대해 정신적으로 메모하고있다 =)
blz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.