1

abc.txtいくつかの値を含むサンプル テキスト ファイルがあります。

Harry Potter - A:JK:1:1:1
Harry Potter - B:JK:1:1:1
Hairy Potter - C:Harry:1:1:1

:、値の間のセパレータです。現在、私はgrep同様の値を試して、最初の列と比較して行を出力しようとしています。

grep -i "harry" BookDB.txt | awk -F ':' '{print $0}'

以下を生成します。

Harry Potter - A:JK:1:1:1
Harry Potter - B:JK:1:1:1
Hairy Potter - C:Harry:1:1:1

ただし、私が達成しようとしている結果は次のとおりです。

Harry Potter - A:JK:1:1:1
Harry Potter - B:JK:1:1:1

助けはありますか?

4

3 に答える 3

2

それawk -F ':' '{print $0}'はすべての行を印刷することだけです。あなたの例では何もしません。

これを行いたい場合は、次のようawkになります。

$ awk -F: '$1~/Harry/' file
Harry Potter - A:JK:1:1:1
Harry Potter - B:JK:1:1:1

# Case insensitive 
$ awk -F: 'tolower($1)~/harry/' file
Harry Potter - A:JK:1:1:1
Harry Potter - B:JK:1:1:1

これは、最初のフィールドが$1一致/Harry/する場合にのみ行を出力します。大文字と小文字を区別しないバージョンでは、最初のフィールドがすべて小文字に変換され、チェックされます/harry/

これが常に当てはまることがわかっている場合harryは、行の先頭に固定できますか?^

$ grep -i "^harry" file
Harry Potter - A:JK:1:1:1
Harry Potter - B:JK:1:1:1
于 2013-01-07T15:57:06.407 に答える
0

「:」セパレーターが最初に出現する前に、行の最初の部分だけを grep したいですか?

ファイルに「%」がないと確信しているとしましょう: 1) 最初 (および最初のみ) の「:」を未使用の文字 (% または別の文字) に置き換え、その前に文字列を挿入できる行を表示します。 %

sed -e 's/:/%/' < BookDB.txt | grep -i '^[^%]*harry[^%]*%'

または、すべての行に「 - 」が含まれている場合: 次のように単純化します。

sed -e 's/:/%/' < BookDB.txt | grep -i '^[^%]*harry'

そしてこれに追加

| sed -e 's/%/:/' # to restore the original line

上記の ":" を " - " (複数文字の区切り記号) などに置き換えると、引き続き機能します。

単一の文字が最初に出現する前に何かを見つける必要がある場合は、そのようにさらに単純化できます (ただし、柔軟性は低くなります)。

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

また

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

(2番目はおそらく、すべての行が一致させる必要があるものと同様の形式である場合にのみ使用する必要があります)

于 2013-01-07T15:43:07.723 に答える
-2

最初の引数で探しているだけの場合はHarry、以下のコマンドでうまくいきます

grep -i "harry " BookDB.txt | awk -F ':' '{print $0}'

ただし、本の完全な名前が必要な場合は、本の名前を抽出して入力と比較する bash スクリプトを作成する必要があります。

于 2013-01-07T15:41:51.140 に答える