Linux中grep與fgrep命令的使用,兩個命令的使用都與文本的搜索與匹配相關,是Linux入門學習中的基礎知識,接下來是我為大家收集的Linux文本匹配命令grep與fgrep使用全解,希望能幫到大家。
Linux文本匹配命令grep與fgrep使用全解
grep
grep (global search regular expression(RE) and print out the line,全面搜索正則表達式並把行列印出來)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行列印出來。Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的擴展,支持更多的re元字元, fgrep就是fixed grep或fast grep,它們把所有的字母都看作單詞,也就是說,正則表達式中的元字元表示回其自身的字面意義,不再特殊。Linux使用GNU版本的grep。它功能更強,可以通過-G、-E、-F命令行選項來使用egrep和fgrep的功能。
grep的工作方式是這樣的,它在一個或多個文件中搜索字元串模板。如果模板包括空格,則必須被引用,模板後的所有字元串被看作文件名。搜索的結果被送到屏幕,不影響原文件內容。
grep可用於shell腳本,因為grep通過返回一個狀態值來說明搜索的狀態,如果模板搜索成功,則返回0,如果搜索不成功,則返回1,如果搜索的文件不存在,則返回2。我們利用這些返回值就可進行一些自動化的文本處理工作。
grep --help
匹配模式選擇:
-E, --extended-regexp 擴展正則表達式egrep
-F, --fixed-strings 一個換行符分隔的字元串的集合fgrep
-G, --basic-regexp 基本正則
-P, --perl-regexp 調用的perl正則
-e, --regexp=PATTERN 後面根正則模式,默認無
-f, --file=FILE 從文件中獲得匹配模式
-i, --ignore-case 不區分大小寫
-w, --word-regexp 匹配整個單詞
-x, --line-regexp 匹配整行
-z, --null-data 一個 0 位元組的數據行,但不是空行
雜項:
-s, --no-messages 不顯示錯誤信息
-v, --invert-match 顯示不匹配的行
-V, --version 顯示版本號
--help 顯示幫助信息
--mmap use memory-mapped input if possible
輸入控制:
-m, --max-count=NUM 匹配的最大數
-b, --byte-offset 列印匹配行前面列印該行所在的塊號碼。
-n, --line-number 顯示的加上匹配所在的行號
--line-buffered 刷新輸出每一行
-H, --with-filename 當搜索多個文件時,顯示匹配文件名前綴
-h, --no-filename 當搜索多個文件時,不顯示匹配文件名前綴
--label=LABEL print LABEL as filename for standard input
-o, --only-matching 只顯示一行中匹配PATTERN 的部分
-q, --quiet, --silent 不顯示任何東西
--binary-files=TYPE 假定二進制文件的TYPE 類型;
TYPE 可以是`binary', `text', 或`without-match'
-a, --text 匹配二進制的東西
-I 不匹配二進制的東西
-d, --directories=ACTION 目錄操作,讀取,遞歸,跳過
-D, --devices=ACTION 設置對設備,FIFO,管道的操作,讀取,跳過
-R, -r, --recursive 遞歸調用
--include=PATTERN 只查找匹配FILE_PATTERN 的文件
--exclude=PATTERN 跳過匹配FILE_PATTERN 的文件和目錄
--exclude-from=FILE 跳過所有除FILE 以外的文件
-L, --files-without-match 匹配多個文件時,顯示不匹配的文件名
-l, --files-with-matches 匹配多個文件時,顯示匹配的文件名
-c, --count 顯示匹配了多少次
-Z, --null 在FILE 文件最後列印空字元
文件控制:
-B, --before-context=NUM 列印匹配本身以及前面的幾個行由NUM控制
-A, --after-context=NUM 列印匹配本身以及隨後的幾個行由NUM控制
-C, --context=NUM 列印匹配本身以及隨後,前面的幾個行由NUM控制
-NUM 根-C的用法一樣的
--color[=WHEN],
--colour[=WHEN] 使用標志高亮匹配字串;
-U, --binary 使用標志高亮匹配字串;
-u, --unix-byte-offsets 當CR 字元不存在,報告位元組偏移(MSDOS 模式)
例:
測試文件
復制代碼
代碼如下:
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/false,aaa,bbbb,cccc,aaaaaa
DADddd:x:2:2:daemon:/sbin:/bin/false
mail:x:8:12:mail:/var/spool/mail:/bin/false
ftp:x:14:11:ftp:/home/ftp:/bin/false
&nobody:$:99:99:nobody:/:/bin/false
zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash
http:x:33:33::/srv/http:/bin/false
dbus:x:81:81:System message bus:/:/bin/false
hal:x:82:82:HAL daemon:/:/bin/false
mysql:x:89:89::/var/lib/mysql:/bin/false
aaa:x:1001:1001::/home/aaa:/bin/bash
ba:x:1002:1002::/home/zhangy:/bin/bash
test:x:1003:1003::/home/test:/bin/bash
@zhangying:*:1004:1004::/home/test:/bin/bash
policykit:x:102:1005:Po
a,匹配含有root的行
復制代碼
代碼如下:
[root@krlcgcms01 test]# grep root test
root:x:0:0:root:/root:/bin/bash
b,匹配以root開頭或者以zhang開頭的行,注意反斜杠
復制代碼
代碼如下:
[root@krlcgcms01 test]# cat test |grep '^\(root\|zhang\)'
root:x:0:0:root:/root:/bin/bash
zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash
c,匹配以root開頭或者以zhang開頭的行,注意反斜杠,根上面一個例子一樣,-e默認是省去的
[root@krlcgcms01 test]# cat test |grep -e '^\(root\|zhang\)'
root:x:0:0:root:/root:/bin/bash
zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash
d,匹配以zhang開頭,只含有字母
復制代碼
代碼如下:
[root@krlcgcms01 test]# echo 'zhangying' |grep '^zhang[a-z]*$'
zhangying
e,匹配以bin開頭的行,用的egrep,在這里可以換成-F,-G
復制代碼
代碼如下:
[root@krlcgcms01 test]# cat test |grep -E '^bin'
bin:x:1:1:bin:/bin:/bin/false,aaa,bbbb,cccc,aaaaaa
f,在匹配的行前面加上該行在文件中,或者輸出中所在的行號
復制代碼
代碼如下:
[root@krlcgcms01 test]# cat test|grep -n zhangy
7:zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash
13:ba:x:1002:1002::/home/zhangy:/bin/bash
15:@zhangying:*:1004:1004::/home/test:/bin/bash
g,不匹配以bin開頭的行,並顯示行號
復制代碼
代碼如下:
[root@krlcgcms01 test]# cat test|grep -nv '^bin'
root:x:0:0:root:/root:/bin/bash
DADddd:x:2:2:daemon:/sbin:/bin/false
mail:x:8:12:mail:/var/spool/mail:/bin/false
ftp:x:14:11:ftp:/home/ftp:/bin/false
&nobody:$:99:99:nobody:/:/bin/false
zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash
http:x:33:33::/srv/http:/bin/false
dbus:x:81:81:System message bus:/:/bin/false
hal:x:82:82:HAL daemon:/:/bin/false
mysql:x:89:89::/var/lib/mysql:/bin/false
aaa:x:1001:1001::/home/aaa:/bin/bash
ba:x:1002:1002::/home/zhangy:/bin/bash
test:x:1003:1003::/home/test:/bin/bash
@zhangying:*:1004:1004::/home/test:/bin/bash
policykit:x:102:1005:Po
h,顯示匹配的個數,不顯示內容
復制代碼
代碼如下:
[root@krlcgcms01 test]# cat test|grep -c zhang
3
i,匹配system,沒有加-i沒有匹配到東西。
復制代碼
代碼如下:
[root@krlcgcms01 test]# grep system test
[root@krlcgcms01 test]# grep -ni system test
9:dbus:x:81:81:System message bus:/:/bin/false
j,匹配zhan沒有匹配到東西,匹配zhangy能匹配到,因為在test文件中,有zhangy這個單詞
復制代碼
代碼如下:
[root@krlcgcms01 test]# cat test|grep -w zhan
[root@krlcgcms01 test]# cat test|grep -w zhangy
zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash
ba:x:1002:1002::/home/zhangy:/bin/bash
k,在這里-x後面東西,和輸出中的整行相同時,才會輸出
[root@krlcgcms01 test]# echo "aaaaaa" |grep -x aaa
[root@krlcgcms01 test]# echo "aaaa" |grep -x aaaa
aaaa
l,最多隻匹配一次,如果把-m 1去掉的話,會有三個
復制代碼
代碼如下:
[root@krlcgcms01 test]# cat test |grep -m 1 zhang
zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash
m,匹配行的前面顯示塊號,這個塊號是干什麼的,不知道,有誰知道可否告訴我一下
復制代碼
代碼如下:
[apacheuser@krlcgcms01 test]$ cat test |grep -b zha
241:zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash
480:ba:x:1002:1002::/home/zhangy:/bin/bash
558:@zhangying:*:1004:1004::/home/test:/bin/bash
n,多文件匹配時,在匹配的行前面加上文件名
復制代碼
代碼如下:
[apacheuser@krlcgcms01 test]$ grep -H 'root' test test2 testbak
test:root:x:0:0:root:/root:/bin/bash
test2:root
testbak:root:x:0:0:root:/root:/bin/bash
o,多文件匹配時,在匹配的行前面不加上文件名
復制代碼
代碼如下:
[apacheuser@krlcgcms01 test]$ grep -h 'root' test test2 testbak
root:x:0:0:root:/root:/bin/bash
root
root:x:0:0:root:/root:/bin/bash
p,多文件匹配時,顯示匹配文件的文件名
復制代碼
代碼如下:
[apacheuser@krlcgcms01 test]$ grep -l 'root' test test2 testbak DAta
test
test2
testbak
q,沒有-o時,有一行匹配,這一行裡面有3個root,加上-o後,這個3個root就出來了
復制代碼
代碼如下:
[apacheuser@krlcgcms01 test]$ grep 'root' test
root:x:0:0:root:/root:/bin/bash
[apacheuser@krlcgcms01 test]$ grep -o 'root' test
root
root
root
r,遞歸顯示匹配的內容,在test目錄下面建個mytest目錄, test目錄下面的test文件到mytest下面,能看到上面的結果
復制代碼
代碼如下:
[root@krlcgcms01 test]# grep test -R /tmp/test/mytest
/tmp/test/mytest/test:test:x:1003:1003::/home/test:/bin/bash
/tmp/test/mytest/test:@zhangying:*:1004:1004::/home/test:/bin/bash
s,顯示匹配root後面的3行
復制代碼
代碼如下:
[root@krlcgcms01 test]# cat test |grep -A 3 root
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/false,aaa,bbbb,cccc,aaaaaa
daemon:x:2:2:daemon:/sbin:/bin/false
mail:x:8:12:mail:/var/spool/mail:/bin/false
fgrep
用法: fgrep [選項]... PATTERN [FILE]...
在每個 FILE 或是標准輸入中查找 PATTERN。
PATTERN 是一組由斷行符分隔的定長字元串。
例如: fgrep -i 'hello world' menu.h main.c
正則表達式選擇與解釋:
-e, --regexp=PATTERN 用 PATTERN 來進行匹配操作
-f, --file=FILE 從 FILE 中取得 PATTERN
-i, --ignore-case 忽略大小寫
-w, --word-regexp 強制 PATTERN 僅完全匹配字詞
-x, --line-regexp 強制 PATTERN 僅完全匹配一行
-z, --null-data 一個 0 位元組的數據行,但不是空行
雜項:
-s, --no-messages 不顯示錯誤信息
-v, --invert-match 選中不匹配的行
-V, --version 顯示版本信息並退出
--help 顯示此幫助並退出
--mmap 忽略向後兼容性
Output control:
-m, --max-count=NUM 匹配的最大數
-b, --byte-offset 列印匹配行前面列印該行所在的塊號碼
-n, --line-number 顯示的加上匹配所在的行號
--line-buffered 刷新輸出每一行
-H, --with-filename 當搜索多個文件時,顯示匹配文件名前綴
-h, --no-filename 當搜索多個文件時,不顯示匹配文件名前綴
--label=LABEL use LABEL as the standard input file name prefix
-o, --only-matching 只顯示一行中匹配PATTERN 的部分
-q, --quiet, --silent 不顯示所有輸出
--binary-files=TYPE 假定二進制文件的TYPE 類型;
TYPE 可以是`binary', `text', 或`without-match'
-a, --text 等同於 --binary-files=text
-I 等同於 --binary-files=without-match
-d, --directories=ACTION 操作目錄的方式;
ACTION 可以是`read', `recurse',或`skip'
-D, --devices=ACTION 操作設備、先入先出隊列、套接字的方式;
ACTION 可以是`read'或`skip'
-R, -r, --recursive 等同於 --directories=recurse
--include=FILE_PATTERN 只查找匹配FILE_PATTERN 的文件
--exclude=FILE_PATTERN 跳過匹配FILE_PATTERN 的文件和目錄
--exclude-from=FILE 跳過所有除FILE 以外的文件
--exclude-dir=PATTERN 跳過所有匹配PATTERN 的目錄。
-L, --files-without-match 只列印不匹配FILEs 的文件名
-l, --files-with-matches 只列印匹配FILES 的文件名
-c, --count 只列印每個FILE 中的匹配行數目
-T, --initial-tab 行首tabs 分隔(如有必要)
-Z, --null 在FILE 文件最後列印空字元
文件控制:
-B, --before-context=NUM 列印以文本起始的NUM 行
-A, --after-context=NUM 列印以文本結尾的NUM 行
-C, --context=NUM 列印輸出文本NUM 行
-NUM 等同於 --context=NUM
--color[=WHEN],
--colour[=WHEN] 使用標志高亮匹配字串;
WHEN 可以是`always', `never'或`auto'
-U, --binary 不要清除行尾的CR 字元(MSDOS 模式)
-u, --unix-byte-offsets 當CR 字元不存在,報告位元組偏移(MSDOS 模式)
‘fgrep’已不再使用了;請用 ‘grep -F’代替。
不帶 FILE 參數,或是 FILE 為 -,將讀取標准輸入。如果少於兩個 FILE 參數
就要默認使用 -h 參數。如果選中任意一行,那退出狀態為 0,否則為 1;
如果有錯誤產生,且未指定 -q 參數,那退出狀態為 2。
例:
復制代碼
代碼如下:
[root@linux test]# cat abc.sh |fgrep a #匹配含有a的
看了“Linux文本匹配命令grep與fgrep使用全解”還想看:
1. linux grep命令詳解
2. 全面解析Linux的grep命令中正則表達式的用法
3. Linux下如何使用grep命令搜索多個單詞
4. 開發人員常用什麼linux命令
㈡ linux.pl文件linux.pl
plsql中什麼是exp?
exp本來就是dos或Linux命令行下的命令rpl/sql命令窗口實際上是相當於調用oracle的sqlplus的命令,其中沒有exp的
LINUX下Oracle數據導入導出的方法詳解?
在「運行」里打開cmd
2
輸入命令:sqlplussystem/123456@orcl
其中system是登錄資料庫的用戶名
123456是用戶名的密碼
orcl是資料庫實例名稱
3
如果提示命令無效,那就是你沒有配置好oracle的環境變數(想當年我也被這個問題困擾著),配置oracle環境變數的方法如下:
1、右擊「我的電腦」->選擇「屬性」->選擇「高級」->單擊「環境變數」2、選擇「path」這一行,單擊「編輯」,在「path」的變數值文本框的最後面先加入一個分號「:」,然後再分號後面加入sqlplus文件的目錄路徑,如「c:programfilesoracleproct10.2.0db_1bin」,然後點擊「確定」按鈕。3、如果在「系統變數」列表框下面的「變數」列中找不到「oracle_home」和「oracle_sid」這兩個變數,則需要下面操作,否則無需一下操作。4、在「系統變數」中點擊「新建」按鈕,在「變數名」中輸入「oracle_home」,變數值中輸入oracle的安裝目錄路徑,如「c:programfilesoracleproct10.2.0db_1」,然後點擊「確定」按鈕。5、在「系統變數」中點擊「新建」按鈕,在「變數名」中輸入「oracle_sid」,變數值中輸入資料庫的實例名,然後點擊「確定」按鈕。
oracle_home:oracle資料庫軟體的安裝目錄oracle_sid:oracle資料庫的實例名oracle資料庫實例名:用於和操作系統進行聯系的標識,即資料庫和操作系統之間的交換是通過資料庫實例名來體現的。
end
第二步,expdp備份命令
1
創建oracle的備份目錄:
sql>createdirectorydpdata1as'd:tempdmp'
這僅僅是在oracle里設定的目錄,並沒有真正創建
2
可以通過這句命令查看到這個目錄
sql>select*fromdba_directories;
3
賦於要導出數據表的所屬用戶許可權
sql>grantread,writeondirectorydpdata1tosshe;
4
好了,到了關鍵一步,之前走了不少彎路,但其它是小問題,在網上零零碎碎查了很多資料,終於找到原因。
首先,要切換回命令窗口,不要再在sql>下運行,然後輸入命令:
expdpsystem/123456@orcldirectory=dpdata1mpfile=sshe.dmplogfile=sshe.logschemas=sshe
5
上面報了一個錯ora-39002:操作無效
原因是d:tempdmp這個目錄不存在,別以為createdirectory之後就會自動生成文件夾,也別以為執行expdp後會自動生成文件夾,要自己手動新建這個目錄文件夾的。新建文件夾後再試一下,果然成功了!恭喜你,已成功備份!
6
如果你要問,導出來的dmp文件怎樣還原回去。好吧,做人做到底,為了省去你再找方法的麻煩,這里我也做一個演示(一般備份的數據是等到資料庫有問題時才用的上)。
首先,再一次登錄資料庫sqlplussystem/123456@orcl
然後,刪除目標資料庫用戶dropusersshecascade;
7
現在來再一次創建用戶,可以用命令創建,也可以在plsql里創建,這里在plsql創建。
用system登錄資料庫,然後右鍵users--新建
然後填寫你的賬號名稱,必須和備份時的用戶一致,並賦於相應的許可權
最後點擊應用,完成用戶創建。
8
返回dos命令窗口,不再是sql>
輸入導入命令:impdpsystem/123456@orcldirectory=dpdata1mpfile=sshe.dmplogfile=sshe.logschemas=sshe
導入成功!
end
步驟3定時執行備份任務
做一個按年月日命名的批處理。在d:temp目錄下新建一個文件,隨便命名為.bat,我的命名為sshe.bat,編輯為如下代碼
-------------------------------------------------------------------------
@echooffremsetbackupfile=f_database_%date:~0,4%-%date:~5,2%-%date:~8,2%.dmpremsetlogfile=f_database_%date:~0,4%-%date:~5,2%-%date:~8,2%./p"d:tempdmp"/d-30/c"cmd/[email protected]/f@path"cdd:tempdmp
rembackupschemassetbackupfile=sshe_%date:~0,4%-%date:~5,2%-%date:~8,2%.dmpsetlogfile=sshe_%date:~0,4%-%date:~5,2%-%date:~8,2%.logexpdpsshe/sshedirectory=dir_dpmpfile=%backupfile%logfile=%logfile%schemas=ssheparallel=4
-------------------------------------------------------------------------------
可以試執行一下,會自動生成一個以年月日命名的備份文件
forfiles/p"d:tempdmp"/d-30/c"cmd/[email protected]/f@path"的作用是:刪除本目錄下30天以後的備份文件,這個挺有用的。
做一個windows每晚自動運行資料庫備份的bat,我的命名為auto.bat編輯如下內容
------------------------------------------------------------------------------
@echooffschtasks/create/tnsshe資料庫定時備份/tr"d:tempsshe_bak.bat"/scdaily/st00:00:00/ru"system"pauseexit
------------------------------------------------------------------------------
雙擊auto.bat,就會在windows添加一個定時任務,每晚0點0分就會自動執行一次sshe.bat,從而完成自動備份的目的。
右鍵我的電腦:管理——任務計劃程序——任務計劃程序庫,可以看到剛才添加進去的定時任務
5
可以將電腦的時鍾設為23點59分50秒,等待10秒鍾,看看自動備份能否成功。如果成功那就大功告成了!!