linux - grep file name




grep for contents AFTER pattern (4)

給定一個文件,例如:

potato: 1234
apple: 5678
potato: 5432
grape: 4567
banana: 5432
sushi: 56789

我想grey所有以potato:開頭的行potato:但只管道跟隨Potato的數字。 所以在上面的例子中,輸出將是:

1234
5432

我怎樣才能做到這一點?


您可以使用grep,因為其他答案狀態。 但是你不需要grep,awk,sed,perl,cut或任何外部工具。 你可以用純粹的bash做到這一點。

試試這個(分號是允許你把它全部放在一行):

$ while read line;
  do
    if [[ "${line%%:\ *}" == "potato" ]];
    then
      echo ${line##*:\ };
    fi;
  done< file.txt

##告訴bash從前面刪除$ line中“:”的最長匹配。

$ while read line; do echo ${line##*:\ }; done< file.txt
1234
5678
5432
4567
5432
56789

或者如果你想要鍵而不是值,%%告訴bash從末尾刪除$ line中“:”的最長匹配。

$ while read line; do echo ${line%%:\ *}; done< file.txt
potato
apple
potato
grape
banana
sushi

要拆分的子字符串是“:\”,因為空格字符必須使用反斜杠進行轉義。

你可以在linux文檔項目中找到更多這樣的東西。


或者使用正則表達式斷言: grep -oP '(?<=potato: ).*' file.txt


grep 'potato:' file.txt | sed 's/^.*: //'

要么

grep 'potato:' file.txt | cut -d\   -f2

要么

grep 'potato:' file.txt | awk '{print $2}'

要么

grep 'potato:' file.txt | perl -e 'for(<>){s/^.*: //;print}'

要么

awk '{if(/potato:/) print $2}' < file.txt

要么

perl -e 'for(<>){/potato:/ && s/^.*: // && print}' < file.txt

sed -n 's/^potato:[[:space:]]*//p' file.txt

人們可以將Grep視為限制性Sed,或將Sed視為廣義Grep。 在這種情況下,Sed是一個很好的輕量級工具,可以滿足您的需求 - 當然,還有其他一些合理的方法可以實現。







grep