두 번째 열의 첫 번째 문자를 egrep하는 방법은 무엇입니까?

두 번째 열의 첫 번째 문자를 egrep하는 방법은 무엇입니까?

egrep을 사용하여 성이 K또는 로 시작하는 모든 줄을 어떻게 인쇄할 수 있습니까 k?

Jennifer Cowan:548-834-2348:583 Laurel Ave., Kingsville, TX 83745:10/1/35:58900
Lesley Kirstin:408-456-1234:4 Harvard Square, Boston, MA 02133:4/22/62:52600
Jennifer Cowan:548-834-2348:583 Laurel Ave., kingsville, TX 83745:10/1/35:58900
Lesley kirstin:408-456-1234:4 Harvard Square, Boston, MA 02133:4/22/62:52600
William Kopf:846-836-2837:6937 Ware Road, Milton, PA 93756:9/21/46:43500
Arthur Putie:923-835-8745:23 Wimp Lane, Kensington, DL 38758:8/31/69:126000

답변1

첫 번째 시도는

  grep '^[^ ]*  *[Kk]'

그러나 이는 항상 정확히 하나의 이름이 있고 이니셜은 없다고 가정합니다.
이 예에서는 -i옵션을 사용하고 [Kk]다음으로 바꿀 수 있습니다.k

첫 번째 콜론을 붙잡는 것이 더 나을 수도 있습니다.

  grep -i ' k[^:]*:'

전체 줄이 아닌 성만 인쇄하려면 awk(또는 perl) 사용을 고려해야 합니다.


업데이트: 첫 번째 grep 표현식이 '^[^ ]* *[Kk]'구성되는 방법은 다음과 같습니다.

  '     apostrophe delimits a parameter that contains spaces
        and other so-called meta-characters that the shell might alter
  ^     caret means start of line
  [     brackets mark a set of characters, any one of which is to be matched
  ^     inside brackets means negation or 'none of the following'
        so `[^ ]` means "not a space"
  ]     is the end of the set.
  *     means 0,1 or more of the prior character
        so `[^ ]*` means any contiguous group of characters that does not 
        contain a space
  then we have two spaces
  *     means 0,1 or more of the prior character
        so space space * means 1 nor more spaces.
  [Kk]  means `K` or `k`
  [^:]* means 0,1 or more characters that are not a colon
  :     followed by a colon

답변2

perl -aF/:/ -ne 'print if $F[0] =~ /\s[Kk]\S+$/'
  • 를 사용하면 -aF/:/전체 행이 콜론으로 구분된 필드로 분할됩니다.
  • $F[0]0번째 필드이며 이름을 포함합니다.
  • /\s[Kk]\S+$/공백( \s)과 일치하고 그 뒤에 K또는 가 오고 그 뒤에 필드 끝까지( )까지 k공백이 아닌 문자( )가옵니다 .\S+$

관련 정보