2016-12-13 107 views
1

我試圖設計一個grep過濾器,其中我有2個或更少的單詞。我很空虛地尋找這個答案,足夠奇怪。如何grep按字數過濾一列?

喜歡的東西:

cat someFile.txt | grep count(\w) < 3 

難道這個功能甚至還存在?

回答

1

隨着grep,你可以匹配匹配正好1個或2個字的模式:

grep -E '^\w+(\s+\w+)?$' someFile.txt 

(注意,這裏假設你要麼沒有任何空行,或者不希望選擇。那些反正)


隨着awk你可以只使用領域條件的數量:

awk 'NF < 3' someFile.txt 
1

只需用awk,而不是grep這個是這樣的:

awk 'NF < 3' file 

NF代表字段數。

1

grep的

grep -E '^$|^\S+(\s+\S+)?$' file 
  • \S是一個非空格字符;
  • ?使前面的模式可選(重複零次或一次)。
  • |是交替運算符(結果爲true,如果其中任何一個模式匹配);
  • ^$匹配空行;

相同的模式也適用於-P選項(Perl兼容的正則表達式)。


GNU桑達

sed -nr '/^$|^\S+(\s+\S+)?$/ p' file 

其中

  • p是打印當前的模式空間(當前行,尤其是)的命令時,如果前面的模式匹配線路;
  • -n關閉圖案空間的自動打印。

該模式與上面的grep命令相同。


的Perl

perl -C -F'/\s+/' -ane 'print if scalar @F < 3' < file 

其中

  • -C使支持Unicode;
  • -F指定-a開關的模式(將輸入拆分爲@F數組的自動模式);
  • -n會導致由-e指定的腳本針對輸入中的每一行運行;
  • scalar @F返回@F中的項目數,即字段數。
+0

正如下面的用戶@Amber所說,grep語句可以跳過空格。是否有包含空白的修改? -E和-P有什麼區別? – Tom

+0

@Tom,如果模式不匹配空行,grep將跳過空行。我在_sed_和_grep_命令中用'^ $ |'添加了空白行。如果PCRE在系統上可用,則Grep的'-P'增加'pcresyntax(3)'和'pcrepattern(3)'中描述的附加功能。順便說一句,琥珀的解決方案只計算ASCII「文字」'\ w +' –