単語数を数え、次のパターンと正確に一致するパターン行を印刷したいと思います。
abc-ERROR:
入力ファイルには以下が含まれます。
# abc-ERROR: xyxxkkfgfr
# def-Error: aaaaaa
# abc-ERROR.cpp
出力は次のようになります。
1 (count)
# abc-ERROR: xyxxkkfgfr (line)
答え1
grep
を使用して行数と行数を取得できますgrep -c
。 2回実行するのが好きではない場合は、置換をgrep
使用して処理できますtee
(ここにbash構文があります)。
grep abc-ERROR: input.txt | tee >( wc -l )
答え2
これはどうですか:
$ cat file
# abc-ERROR: xyxxkkfgfr
# abc-ERROR: xyxxkkfgfr
# abc-ERROR: xyxxkkfgfr
# def-Error: aaaaaa
# abc-ERROR.cp
# abc-ERROR: asdgsdgaaf
# abc-ERROR: asdgsdgaaf
# abc-ERROR: tttttttttq
$ awk '/abc-ERROR: /{a[$0]++}END{for(k in a) printf "%d\t(count)\n%s\t(line)\n",a[k],k}' file
1 (count)
# abc-ERROR: tttttttttq (line)
2 (count)
# abc-ERROR: asdgsdgaaf (line)
3 (count)
# abc-ERROR: xyxxkkfgfr (line)
答え3
私はこの問題を解決するために2つのアプローチを提案します。
1)bashrc / bash_profileに関数を配置し、関数を呼び出すエイリアスを作成します(この関数はグローバルに使用されます)。
2)シェルスクリプトファイルを作成したり、ファイルのエイリアスを生成したりできます。
#!/bin/bash
function matchString(){
REGEX="$1"
FILE="$2"
RESULTS=$(grep -n "$REGEX" $FILE | awk -F ":" '{print $2 "\tLine: " $1}')
COUNT=$(echo $RESULTS | wc -l)
echo "Count: $COUNT"
echo $RESULTS
}
matchString $1 $2
テキストファイル(例:bash matchString.sh "abc-ERROR:" test.txt)に対してこれを呼び出すと、次のように出力されます。
数量:1
abc - エラー行:1
- この関数は、最初の引数を正規表現パターンとして使用して(同様のシナリオで再利用可能)、そのパターンの2番目の引数として呼び出されたファイルを取得します。
出力の最初の行は一致するすべての行の総数であり、その後の各行は一致項目で、その後に対応する一致の行番号を表すタブ文字が続きます。