回答:
でgrep:
grep -En '.{12}' file
12文字以上の行の場合。
いくつかのファイルで:
find . -type f -exec grep -En '.{12}' {} +
grepGNUのような一部の実装grepは、ファイル検索を自分で行うことができます。
grep -rEn '.{12}' .
ただし、シンボリックリンクやその他の非正規ファイルには注意してください。
AWKソリューション
awk '{
if (length($0) > 5)
print $0;'} yourfile
または、より簡潔に:
awk 'length > 5' file
awk 'length > 5'
awkやや少ないエレガントなく、簡潔なawk '/^.{6,}/'
awk '/.{6}/'(実際には、GNU awkは、POSIXLY_CORRECTを環境に渡さない限り機能しないものでした)。
Bashソリューション
#!/bin/bash
count=0
while read; do
((++count))
len=${#REPLY}
if ((len > 80)); then
echo "Line $count is $len characters."
fi
done
だから、例えば、./whatever.sh < input.file。これには、から1を引いた改行は含まれません$len。それが望ましくない場合、または入力でCRLFの末尾を使用する場合は、それに応じて調整する必要があります。
${#line}を避けないのexprですか?
bashソリューションの場合は+1 。ただしIFS=、の前に固執しない限りread、先頭のスペースは無視されることに注意してください。
$lineないため、1を引く必要はありません。
readに読み込む名前を指定しなかった場合REPLY、すべての空白文字を読み込んで含めます。IFS設定は必要ありません。
while readテキストを処理するループは本当に悪い習慣です。
perl長い80文字を超える行を探しているあなたを仮定して、(例えば):
行を表示するには:
$ perl -nle 'print if length > 80' your_file
行番号を表示するには:
$ perl -nle 'print "$.\n" if length > 80' your_file
または両方:
$ perl -nle 'print "[$.]: $_\n" if length > 80' your_file
-lコマンドラインを追加する必要perlがあります。行の改行をカウントします。
別のbashソリューション(bash 4)を次に示します。
minlen=5 # minimum length of a line
mapfile -tO1 < inputfile # Map the file to the array MAPFILE (by default)
# Start the array at index 1
for i in "${!MAPFILE[@]}"; do
(( ${#MAPFILE[i]} > minlen )) || unset MAPFILE[i] # Remove shorter elements
done
結果の配列はまばらなので、配列のインデックスは維持されます。1から開始したため、インデックスは保持した行の行番号です。これらの行番号のみを出力できます。
printf 'Long lines found at: '
printf '%d, ' "${!MAPFILE[@]}"
echo
または、行自体を出力できます。
printf '%s\n' "${MAPFILE[@]}"
grepまたは行番号として、または何か他のものとして(おそらく、それらに別のアクションを適用したい)おそらくこれを行う最も便利な方法は、次にこれらの行で何が行われるかに依存します。