man grep得到下列信息
- 正常輸出: 輸出含有指定字符串的全部行。
- -v, --invert-match: 反向操作,輸出不含有指定字符串的全部行。
- -c, --count: 禁止正常輸出;輸出含有指定字符串的行有幾行。當與-v, --invert-match選項配合使用時,輸出不含指定字符串的行有幾行。
- -o, --only-matching: 隻輸出全部的指定字符串,而不輸出含有指定字符串的全部行。
- -l, --files-with-matches: 禁止正常輸出;輸出内容含指定字符串的全部文件的名稱。
- -L, --files-without-match: 禁止正常輸出;輸出内容不含指定字符串的全部文件的名稱。-l與-L是相反的。
- -Z: 一般結合-l選項使用。若grep -l不使用-Z,則輸出的多個文件名之間是以換行符分隔開;若grep -l使用-Z,則輸出的多個文件名之間是以null字符分隔隔。
- -n, --line-number: 顯示行号。
- -i, --ignore-case: 模式(pattern)和标準輸出(stdout)裡不區分字母大小寫。
grep命令的語法:
- 當grep的命令參數為文件時: grep [選項1] [選項2] [選項n] [一個待找的字符串] [參數1(文件1)] [參數2(文件2)] [參數n(文件n)]。如果把grep理解為find,那就是: find a string inside a file or more files.
- 當grep的命令參數為目錄時: grep -r或-R [選項1] [選項2] [選項n] [一個待找的字符串] [參數1(目錄1)] [參數2(目錄2)] [參數n(目錄n)]。
find命令是在文件名稱或目錄名稱裡找指定的字符串。一般,find命令的輸出結果是找到的文件名或目錄名。
grep命令是在文件内容或stdin裡找指定的字符串。然而,grep的輸出結果卻不一定是找到的字符串,而是根據不同的命令選項有不同的輸出,例如,正常輸出模式時會輸出含指定字符串的全部行,加了-l命令選項會輸出含指定字符串的全部文件,等等。
正常輸出模式: 輸出含指定字符串的全部行
root@hgdm:~/examples# cat grep_data.txt
孤舟蓑笠翁,獨釣寒江雪。
花間一壺酒,獨酌無相親。
細草微風岸,危樯獨夜舟。
落葉他鄉樹,寒燈獨夜人。
海内存知己,天涯若比鄰。
烽火連三月,家書抵萬金。
紅豆生南國,春來發幾枝。
# 輸出含獨字的全部行
root@hgdm:~/examples# grep '獨' grep_data.txt
孤舟蓑笠翁,獨釣寒江雪。
花間一壺酒,獨酌無相親。
細草微風岸,危樯獨夜舟。
落葉他鄉樹,寒燈獨夜人。
grep常規輸出模式
選項-v: 輸出不含指定字符串的全部行
root@hgdm:~/examples# cat grep_data.txt
孤舟蓑笠翁,獨釣寒江雪。
花間一壺酒,獨酌無相親。
細草微風岸,危樯獨夜舟。
落葉他鄉樹,寒燈獨夜人。
海内存知己,天涯若比鄰。
烽火連三月,家書抵萬金。
紅豆生南國,春來發幾枝。
# 反向操作,輸出不含獨字的全部行
root@hgdm:~/examples# grep -v '獨' grep_data.txt
海内存知己,天涯若比鄰。
烽火連三月,家書抵萬金。
紅豆生南國,春來發幾枝。
grep -v反選操作
選項-c: 輸出有幾行
root@hgdm:~/examples# cat grep_data.txt
孤舟蓑笠翁,獨釣寒江雪。
花間一壺酒,獨酌無相親。
細草微風岸,危樯獨夜舟。
落葉他鄉樹,寒燈獨夜人。
海内存知己,天涯若比鄰。
烽火連三月,家書抵萬金。
紅豆生南國,春來發幾枝。
# 含獨字的行總共有4行,所以輸出4
root@hgdm:~/examples# grep -c '獨' -n grep_data.txt
4
grep -c 輸出行數
選項-l: 輸出内容含指定字符串的全部文件
root@hgdm:~/examples/temp# cat data1.txt
孤舟蓑笠翁,獨釣寒江雪。
花間一壺酒,獨酌無相親。
root@hgdm:~/examples/temp# cat data2.txt
細草微風岸,危樯獨夜舟。
落葉他鄉樹,寒燈獨夜人。
# 找到當前目錄下含獨字的全部文件的名稱
root@hgdm:~/examples/temp# grep -lR '獨' ./
./data1.txt
./data2.txt
root@hgdm:~/examples/temp# grep -lR -Z '獨' ./ | xargs -0 cat
孤舟蓑笠翁,獨釣寒江雪。
花間一壺酒,獨酌無相親。
細草微風岸,危樯獨夜舟。
落葉他鄉樹,寒燈獨夜人。
grep -lR -Z
選項-o: 僅僅輸出指定的字符串
root@hgdm:~/examples# cat grep_data.txt
孤舟蓑笠翁,獨釣寒江雪。
花間一壺酒,獨酌無相親。
細草微風岸,危樯獨夜舟。
落葉他鄉樹,寒燈獨夜人。
海内存知己,天涯若比鄰。
烽火連三月,家書抵萬金。
紅豆生南國,春來發幾枝。
# 隻輸出文件中的全部獨字,而不輸出包含獨字的行
root@hgdm:~/examples# grep -o '獨' grep_data.txt
獨
獨
獨
獨
grep -o
當grep的參數是文件和stdin組合時
root@hgdm:~/examples# echo -e '獨在異鄉為異客\n獨善其身'
獨在異鄉為異客
獨善其身
root@hgdm:~/examples# cat grep_data.txt
孤舟蓑笠翁,獨釣寒江雪。
花間一壺酒,獨酌無相親。
細草微風岸,危樯獨夜舟。
落葉他鄉樹,寒燈獨夜人。
海内存知己,天涯若比鄰。
烽火連三月,家書抵萬金。
紅豆生南國,春來發幾枝。
root@hgdm:~/examples# echo -e '獨在異鄉為異客\n獨善其身' | grep '獨' - grep_data.txt
(standard input):獨在異鄉為異客
(standard input):獨善其身
grep_data.txt:孤舟蓑笠翁,獨釣寒江雪。
grep_data.txt:花間一壺酒,獨酌無相親。
grep_data.txt:細草微風岸,危樯獨夜舟。
grep_data.txt:落葉他鄉樹,寒燈獨夜人。
當grep的參數是文件和stdin組合時
當需找兩個或兩個以上的指定字符串時上面的例子,都是在文件或stdin裡查找一個指定字符串,有時候,需要在文件或stdin裡查找兩個或兩個以上指定字符串。
語法為: grep -e "待找字符串1" -e "待找字符串2" -e "待找字符串3"
root@hgdm:~/ls_data# cat file1.txt
孤舟蓑笠翁,獨釣寒江雪。
海内存知己,天涯若比鄰。
root@hgdm:~/ls_data# cat file2.txt
花間一壺酒,獨酌無相親。
烽火連三月,家書抵萬金。
root@hgdm:~/ls_data# cat file3.txt
細草微風岸,危樯獨夜舟。
野曠天低樹,江清月近人。
root@hgdm:~/ls_data# grep -e '孤舟' -e '一壺酒' -e '野曠' -e '天涯' file1.txt file2.txt file3.txt
file1.txt:孤舟蓑笠翁,獨釣寒江雪。
file1.txt:海内存知己,天涯若比鄰。
file2.txt:花間一壺酒,獨酌無相親。
file3.txt:野曠天低樹,江清月近人。
grep -e指定多個待找字符串
當待找的指定字符串是一個正則表達式時當需要完全使用正則表達式時,使用grep -E或egrep命令。
root@hgdm:~/ls_data# echo -e "孤舟蓑笠翁\n獨釣寒江雪\n2022 The best"
孤舟蓑笠翁
獨釣寒江雪
2022 The best
root@hgdm:~/ls_data# echo -e "孤舟蓑笠翁\n獨釣寒江雪\n2022 The best" | grep -E '[0-9] '
2022 The best
root@hgdm:~/ls_data# echo -e "孤舟蓑笠翁\n獨釣寒江雪\n2022 The best" | egrep '[0-9] '
2022 The best
grep -E和egrep
當grep的參數是含有通配符*的文件名時
root@hgdm:~/ls_data# ls
dir1 dir2 dir3 file1.txt file2.txt file3.txt
root@hgdm:~/ls_data# cat file*
孤舟蓑笠翁,獨釣寒江雪。
海内存知己,天涯若比鄰。
花間一壺酒,獨酌無相親。
烽火連三月,家書抵萬金。
細草微風岸,危樯獨夜舟。
野曠天低樹,江清月近人。
# *file*匹配到file1.txt file2.txt file3.txt
root@hgdm:~/ls_data# grep '獨' *file*
file1.txt:孤舟蓑笠翁,獨釣寒江雪。
file2.txt:花間一壺酒,獨酌無相親。
file3.txt:細草微風岸,危樯獨夜舟。
*file*匹配到file1.txt file2.txt file3.txt
如何讓ls命令隻列出目錄或文件
# 隻列出目錄
ls -l | grep '^d'
# 隻列出文件
ls -l | grep '^-'
上述命令的執行結果如下
root@hgdm:~/ls_data# ls -l
total 12
drwxr-xr-x 2 root root 4096 Apr 4 14:10 dir1
drwxr-xr-x 2 root root 4096 Apr 4 14:10 dir2
drwxr-xr-x 2 root root 4096 Apr 4 14:10 dir3
-rw-r--r-- 1 root root 0 Apr 4 14:09 file1.txt
-rw-r--r-- 1 root root 0 Apr 4 14:09 file2.txt
-rw-r--r-- 1 root root 0 Apr 4 14:09 file3.txt
root@hgdm:~/ls_data# ls -l | grep '^d'
drwxr-xr-x 2 root root 4096 Apr 4 14:10 dir1
drwxr-xr-x 2 root root 4096 Apr 4 14:10 dir2
drwxr-xr-x 2 root root 4096 Apr 4 14:10 dir3
root@hgdm:~/ls_data# ls -l | grep '^-'
-rw-r--r-- 1 root root 0 Apr 4 14:09 file1.txt
-rw-r--r-- 1 root root 0 Apr 4 14:09 file2.txt
-rw-r--r-- 1 root root 0 Apr 4 14:09 file3.txt
ls和grep組合隻列出目錄或文件
,