2 番目の列の最初の文字を egrep するにはどうすればよいでしょうか?

2 番目の列の最初の文字を 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]'

しかし、これは常に名前が1つだけあり、イニシャルがないことを前提としています。
この例では、オプションを使用して、次のように-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続き、その後にフィールドの末尾 ( ) までの任意の数のスペース以外の文字 ( ) が続く文字列に一致します。Kk\S+$

関連情報