運(yùn)算符 | 描述 | 示例 |
文件比較運(yùn)算符 | ||
-efilename | 如果filename存在,則為真 | [ -e /var/log/syslog ] |
-dfilename | 如果filename為目錄,則為真 | [ -d /tmp/mydir ] |
-ffilename | 如果filename為常規(guī)文件,則為真 | [ -f /usr/bin/grep ] |
-Lfilename | 如果filename為符號(hào)鏈接,則為真 | [ -L /usr/bin/grep ] |
-rfilename | 如果filename可讀,則為真 | [ -r /var/log/syslog ] |
-wfilename | 如果filename可寫,則為真 | [ -w /var/mytmp.txt ] |
-xfilename | 如果filename可執(zhí)行,則為真 | [ -L /usr/bin/grep ] |
filename1-ntfilename2 | 如果filename1比filename2新,則為真 | [ /tmp/install/etc/services -nt /etc/services ] |
filename1-otfilename2 | 如果filename1比filename2舊,則為真 | [ /boot/bzImage -ot arch/i386/boot/bzImage ] |
字符串比較運(yùn)算符[size=-1](請(qǐng)注意引號(hào)的使用,這是防止空格擾亂代碼的好方法) | ||
-zstring | 如果string長度為零,則為真 | [ -z "$myvar" ] |
-nstring | 如果string長度非零,則為真 | [ -n "$myvar" ] |
string1=string2 | 如果string1與string2相同,則為真 | [ "$myvar" = "one two three" ] |
string1!=string2 | 如果string1與string2不同,則為真 | [ "$myvar" != "one two three" ] |
算術(shù)比較運(yùn)算符 | ||
num1-eqnum2 | 等于 | [ 3 -eq $mynum ] |
num1-nenum2 | 不等于 | [ 3 -ne $mynum ] |
num1-ltnum2 | 小于 | [ 3 -lt $mynum ] |
num1-lenum2 | 小于或等于 | [ 3 -le $mynum ] |
num1-gtnum2 | 大于 | [ 3 -gt $mynum ] |
num1-genum2 | 大于或等于 | [ 3 -ge $mynum ] |
#!/sbin/sh
######################################
## 名稱: infuser_load.sh
## 描述: 通用接口文件 導(dǎo)入數(shù)據(jù)庫
## 參數(shù): owner table_name
## 作者: xxx
## 日期: 2011-03-04
######################################
##owner
owner=$1
##table_name
table_name=$2
##batchId
batchId=$3
##day_id
day_id=$4
##日期[YYYYMMDD]
DAYID=`date +'%Y%m%d'`
##月份[YYYYMM]
MONTHID=`date +'%Y%m'`
##shell文件目錄
sh_dir=/inffile/shell/
cd ${sh_dir}
##load文件###########################
##file_name
file_name=`sqlplus -s infuser/xxx@DATACK <<EOF
set heading off feedback off pagesize 0 verify off echo off
select replace(replace(to_char(file_name), '@DAYID@', '${DAYID}'), '@MONTHID@', '${MONTHID}')
from datackdb.inf_file_def
where owner = '${owner}'
and table_name = '${table_name}'
and state = '00A'
and rownum <= 1;
exit
EOF`
#echo "${file_name}"
##ctl_file
ctl_file=`sqlplus -s infuser/xxx@DATACK <<EOF
set heading off feedback off pagesize 0 verify off echo off
select replace(replace(to_char(ctl_file), '@DAYID@', '${DAYID}'), '@MONTHID@', '${MONTHID}')
from datackdb.inf_file_def
where owner = '${owner}'
and table_name = '${table_name}'
and state = '00A'
and rownum <= 1;
exit
EOF`
#echo "${ctl_file}"
infile=""
for fname in $file_name
do
if [ -r ${fname} ]
then
infile=$infile"INFILE '${fname}'\n"
fi
done
#是否包含@INFILE@字符串的判斷
if echo "$ctl_file"|grep -q "@INFILE@"
then
#分隔符前字符串
echo "${ctl_file%%@INFILE@*}" >${table_name}.ctl
#文件名
echo "${infile}" >>${table_name}.ctl
#分隔符后字符串
echo "${ctl_file##*@INFILE@}" >>${table_name}.ctl
else
echo "${ctl_file}" >${table_name}.ctl
fi
#導(dǎo)入數(shù)據(jù)
sqlldr infuser/infuser@DATACK control=${table_name}.ctl direct=y errors=1000
#刪除控制文件
#rm ${table_name}.ctl
#rm ${table_name}.log
##寫消息
sqlplus infuser/infuser@DATACK <<EOF
insert into datackdb.inf_data_msg (OWNER, TABLE_NAME, FWF_NO, LAN_ID, DAY_ID, STATE, STATE_DATE, COMMENTS)
values ('${owner}', '${table_name}', '${batchId}', -1, '${day_id}', '00A', sysdate, '');
exit
EOF
date +'%Y-%m-%d %T' >>param.txt
echo "$0 $*" >>param.txt
echo "$0 $* -- 成功"
#! /bin/bash
var1="hello"
var2="he"
#方法1
if [ ${var1:0:2} = $var2 ]
then
echo "1:include"
fi
#方法2
echo "$var1" |grep -q "$var2"
if [ $? -eq 0 ]
then
echo "2:include"
fi
#方法3
echo "$var1" |grep -q "$var2" && echo "include" ||echo "not"
#方法4
[[ "${var1/$var2/}" != "$var2" ]] && echo "include" || echo "not"
其他方法:
expr或awk的index函數(shù)
${var#...}
${var%...}
${var/.../...}
shell判斷文件,目錄是否存在或者具有權(quán)限
www.firnow.com 時(shí)間 : 2009-03-04 作者:匿名 編輯:sky 點(diǎn)擊: 1632 [ 評(píng)論 ]
-
-
shell判斷文件,目錄是否存在或者具有權(quán)限
#!/bin/sh
myPath="/var/log/httpd/"
myFile="/var /log/httpd/access.log"
#這里的-x 參數(shù)判斷$myPath是否存在并且是否具有可執(zhí)行權(quán)限
if [ ! -x "$myPath"]; then
mkdir "$myPath"
fi
#這里的-d 參數(shù)判斷$myPath是否存在
if [ ! -d "$myPath"]; then
mkdir "$myPath"
fi
#這里的-f參數(shù)判斷$myFile是否存在
if [ ! -f "$myFile" ]; then
touch "$myFile"
fi
#其他參數(shù)還有-n,-n是判斷一個(gè)變量是否是否有值
if [ ! -n "$myVar" ]; then
echo "$myVar is empty"
exit 0
fi
#兩個(gè)變量判斷是否相等
if [ "$var1" = "$var2" ]; then
echo '$var1 eq $var2'
else
echo '$var1 not eq $var2'
fi
shell字符串的截取的問題:
一、Linux shell 截取字符變量的前8位,有方法如下:
1.expr substr “$a” 1 8
2.echo $a|awk ‘{print substr(,1,8)}’
3.echo $a|cut -c1-8
4.echo $
5.expr $a : ‘\(.\\).*’
6.echo $a|dd bs=1 count=8 2>/dev/null
二、按指定的字符串截取
1、第一種方法:
${varible##*string} 從左向右截取最后一個(gè)string后的字符串
${varible#*string}從左向右截取第一個(gè)string后的字符串
${varible%%string*}從右向左截取最后一個(gè)string后的字符串
${varible%string*}從右向左截取第一個(gè)string后的字符串
“*”只是一個(gè)通配符可以不要
例子:
$ MYVAR=foodforthought.jpg
$ echo ${MYVAR##*fo}
rthought.jpg
$ echo ${MYVAR#*fo}
odforthought.jpg
2、第二種方法:${varible:n1:n2}:截取變量varible從n1到n2之間的字符串。
可以根據(jù)特定字符偏移和長度,使用另一種形式的變量擴(kuò)展,來選擇特定子字符串。試著在 bash 中輸入以下行:
$ EXCLAIM=cowabunga
$ echo ${EXCLAIM:0:3}
cow
$ echo ${EXCLAIM:3:7}
abunga
這種形式的字符串截?cái)喾浅:啽悖恍栌妹疤?hào)分開來指定起始字符和子字符串長度。
三、按照指定要求分割:
比如獲取后綴名
ls -al | cut -d “.” -f2
應(yīng)用心得:
$MYVAR="12|dadg"
echo ${MYVAR##*|} #打印分隔符后的字符串
dafa
echo ${MYVAR%%|*} #打印分隔符前的字符串
12
awk內(nèi)置字符串函數(shù)詳解(轉(zhuǎn))
awk提供了許多強(qiáng)大的字符串函數(shù),見下表:
awk內(nèi)置字符串函數(shù)
gsub(r,s) 在整個(gè)$0中用s替代r
gsub(r,s,t) 在整個(gè)t中用s替代r
index(s,t)
返回s中字符串t的第一位置
length(s)
返回s長度
match(s,r)
測試s是否包含匹配r的字符串
split(s,a,fs) 在fs上將s分成序列a
sprint(fmt,exp) 返回經(jīng)fmt格式化后的exp
sub(r,s)
用$0中最左邊最長的子串代替s
substr(s,p) 返回字符串s中從p開始的后綴部分
substr(s,p,n)
返回字符串s中從p開始長度為n的后綴部分
詳細(xì)說明一下各個(gè)函數(shù)的使用方法。
gsub函數(shù)有點(diǎn)類似于sed查找和替換。它允許替換一個(gè)字符串或字符為另一個(gè)字符串或字符,并以正則表達(dá)式的形式執(zhí)行。第一個(gè)函數(shù)作用于記錄$0,第二個(gè)gsub函數(shù)允許指定目標(biāo),然而,如果未指定目標(biāo),缺省為$0。
index(s,t)函數(shù)返回目標(biāo)字符串s中查詢字符串t的首位置。length函數(shù)返回字符串s字符
長度。match函數(shù)測試字符串s是否包含一個(gè)正則表達(dá)式r定義的匹配。split使用域分隔符fs將
字符串s劃分為指定序列a。sprint函數(shù)類似于printf函數(shù)(以后涉及),返回基本輸出格式fmt的
結(jié)果字符串exp。sub(r,s)函數(shù)將用s替代$0中最左邊最長的子串,該子串被(r)匹配。
sub(s,p)返回字符串s在位置p后的后綴。substr(s,p,n)同上,并指定子串長度為n。
現(xiàn)在看一看awk中這些字符串函數(shù)的功能。
1.gsub
要在整個(gè)記錄中替換一個(gè)字符串為另一個(gè),使用正則表達(dá)式格式,/目標(biāo)模式/,替換模式
/。例如改變學(xué)生序號(hào)4842到4899:
$ awk 'gsub('4842/, 4899) {print $0}' grade.txt
J.Troll 07/99 4899 Brown-3 12 26 26
2.index
查詢字符串s中t出現(xiàn)的第一位置。必須用雙引號(hào)將字符串括起來。例如返回目標(biāo)字符串
Bunny中ny出現(xiàn)的第一位置,即字符個(gè)數(shù)。
$ awk 'BEGIN {print index("Bunny", "ny")} grade.txt
4
3.length
返回所需字符串長度,例如檢驗(yàn)字符串J.Troll返回名字及其長度,即人名構(gòu)成的字符個(gè)
數(shù)。
$ awk '$1=="J.Troll" {print length($1) " "$1}' grade.txt
7 J.Troll
還有一種方法,這里字符串加雙引號(hào)。
$ awk 'BEGIN {print length("A FEW GOOD MEN")}'
14
4.match
match測試目標(biāo)字符串是否包含查找字符的一部分。可以對(duì)查找部分使用正則表達(dá)式,返
回值為成功出現(xiàn)的字符排列數(shù)。如果未找到,返回0,第一個(gè)例子在ANCD中查找d。因其不
存在,所以返回0。第二個(gè)例子在ANCD中查找D。因其存在,所以返回ANCD中D出現(xiàn)的首位
置字符數(shù)。第三個(gè)例子在學(xué)生J.Lulu中查找u。
$ awk '{BEGIN {print match("ANCD", /d/)}'
0
$ awk '{BEGIN {print match("ANCD", /C/)}'
3
$ awk '$1=="J.Lulu" {print match($1, "u")} grade.txt
4
5.split
使用split返回字符串?dāng)?shù)組元素個(gè)數(shù)。工作方式如下:如果有一字符串,包含一指定分隔
符-,例如AD2-KP9-JU2-LP-1,將之劃分成一個(gè)數(shù)組。使用split,指定分隔符及數(shù)組名。此
例中,命令格式為("AD2-KP9-JU2-LP-1",parts_array,"-"),split然后返回?cái)?shù)組下標(biāo)數(shù),這
里結(jié)果為4。
還有一個(gè)例子使用不同的分隔符。
$ awk '{BEGIN {print split("123#456#678", myarray, "#")}'
3
這個(gè)例子中,split返回?cái)?shù)組myarray的下標(biāo)數(shù)。數(shù)組myarray取值如下:
Myarray[1]="123"
Myarray[2]="456"
Myarray[3]="789"
6.sub
使用sub發(fā)現(xiàn)并替換模式的第一次出現(xiàn)位置。字符串STR包含‘popedpopopill’,執(zhí)行下
列sub命令sub(/op/,"op",STR)。模式op第一次出現(xiàn)時(shí),進(jìn)行替換操作,返回結(jié)果如下:
‘pOPedpopepill’。
假如grade.txt文件中,學(xué)生J.Troll的記錄有兩個(gè)值一樣,“目前級(jí)別分”與“最高級(jí)別分”。只
改變第一個(gè)為29,第二個(gè)仍為24不動(dòng),操作命令為sub(/26/,"29",$0),只替換第一個(gè)出現(xiàn)
24的位置。
$ awk '$1=="J.Troll" sub(/26/, "29", $0)' grade.txt
L.Troll 07/99 4842 Brown-3 12 29 26
L.Transley 05/99 4712 Brown-2 12 30 28
7.substr
substr是一個(gè)很有用的函數(shù)。它按照起始位置及長度返回字符串的一部分。例子如下:
$ awk '$1=="L.Transley" {print substr($1, 1,5)}' grade.txt
L.Tan
上面例子中,指定在域1的第一個(gè)字符開始,返回其前面5個(gè)字符。
如果給定長度值遠(yuǎn)大于字符串長度, awk將從起始位置返回所有字符,要抽取L.Tansley的姓,只需從第3個(gè)字符開始返回長度為7。可以輸入長度99,awk返回結(jié)果相同。
$ awk '{$1=="L.Transley" {print substr($1, 3,99)}' grade.txt
Transley
substr的另一種形式是返回字符串后綴或指定位置后面字符。這里需要給出指定字符串及其返回字串的起始位置。例如,從文本文件中抽取姓氏,需操作域1,并從第三個(gè)字符開始:
$ awk '{print substr($1, 3)}' grade.txt
Troll
Transley
還有一個(gè)例子,在BEGIN部分定義字符串,在END部分返回從第t個(gè)字符開始抽取的子串。
$ awk '{BEGIN STR="A FEW GOOD MEN"} END {print substr(STR,7)) grade.txt
GOOD MEN
8.從shell中向awk傳入字符串
awk腳本大多只有一行,其中很少是字符串表示的,這一點(diǎn)通過將變量傳入awk命令行會(huì)變得很容易。現(xiàn)就其基本原理講述一些例子。
使用管道將字符串stand-by傳入awk,返回其長度。
$ echo "Stand-by" | awk '{print length($0)}'
8
設(shè)置文件名為一變量,管道輸出到awk,返回不帶擴(kuò)展名的文件名。
$ STR="mydoc.txt"
$ echo $STR | awk '{print subst($STR, 1, 5)}'
mydoc
設(shè)置文件名為一變量,管道輸出到awk,只返回其擴(kuò)展名。
$ STR="mydoc.txt"
$ echo $STR | awk '{print substr($STR, 7)}'
txt
作者:北南南北
來自:LinuxSir.Org
摘要: 本文講述幾種常用文件內(nèi)容的查看工具,比如cat、more、less、head、tail等,把這些工具最常用的參數(shù)、動(dòng)作介紹給新手,能讓新手在短短的幾分鐘內(nèi)上手運(yùn)用。此文獻(xiàn)給面對(duì)黑色的控制臺(tái)不知所措的弟兄。
目錄
2、more 文件內(nèi)容或輸出查看工具;
3、less 查看文件內(nèi)容 工具;
4、head 工具,顯示文件內(nèi)容的前幾行;
5、tail 工具,顯示文件內(nèi)容的最后幾行;
6、關(guān)于本文;
7、后記;
8、參考文檔;
9、相關(guān)文檔;
+++++++++++++++++++++++++++++++++++++
正文
+++++++++++++++++++++++++++++++++++++
1、cat 顯示文件連接文件內(nèi)容的工具;
cat 是一個(gè)文本文件查看和連接工具。查看一個(gè)文件的內(nèi)容,用cat比較簡單,就是cat 后面直接接文件名。
比如:
[root@localhost ~]# cat /etc/fstab
為了便于新手弟兄靈活掌握這個(gè)工具,我們多說一點(diǎn)常用的參數(shù);
1.0 cat 語法結(jié)構(gòu);
cat [選項(xiàng)] [文件]...
選項(xiàng) -A, --show-all 等價(jià)于 -vET -b, --number-nonblank 對(duì)非空輸出行編號(hào) -e 等價(jià)于 -vE -E, --show-ends 在每行結(jié)束處顯示 $ -n, --number 對(duì)輸出的所有行編號(hào) -s, --squeeze-blank 不輸出多行空行 -t 與 -vT 等價(jià) -T, --show-tabs 將跳格字符顯示為 ^I -u (被忽略) -v, --show-nonprinting 使用 ^ 和 M- 引用,除了 LFD 和 TAB 之外 --help 顯示此幫助信息并離開
1.1 cat 查看文件內(nèi)容實(shí)例;
[root@localhost ~]# cat /etc/profile 注:查看/etc/目錄下的profile文件內(nèi)容;
[root@localhost ~]# cat -b /etc/fstab 注:查看/etc/目錄下的profile內(nèi)容,并且對(duì)非空白行進(jìn)行編號(hào),行號(hào)從1開始;
[root@localhost ~]# cat -n /etc/profile 注:對(duì)/etc目錄中的profile的所有的行(包括空白行)進(jìn)行編號(hào)輸出顯示;
[root@localhost ~]# cat -E /etc/profile 注:查看/etc/下的profile內(nèi)容,并且在每行的結(jié)尾處附加$符號(hào);
cat 加參數(shù)-n 和nl工具差不多,文件內(nèi)容輸出的同時(shí),都會(huì)在每行前面加上行號(hào);
[root@localhost ~]# cat -n /etc/profile
[root@localhost ~]# nl /etc/profile
cat 可以同時(shí)顯示多個(gè)文件的內(nèi)容,比如我們可以在一個(gè)cat命令上同時(shí)顯示兩個(gè)文件的內(nèi)容;
[root@localhost ~]# cat /etc/fstab /etc/profile
cat 對(duì)于內(nèi)容極大的文件來說,可以通過管道|傳送到more 工具,然后一頁一頁的查看;
[root@localhost ~]# cat /etc/fstab /etc/profile | more
1.2 cat 的創(chuàng)建、連接文件功能實(shí)例;
cat 有創(chuàng)建文件的功能,創(chuàng)建文件后,要以EOF或STOP結(jié)束;
[root@localhost ~]# cat > linuxsir.org.txt << EOF 注:創(chuàng)建linuxsir.org.txt文件;
> 我來測試 cat 創(chuàng)建文件,并且為文件輸入內(nèi)容; 注:這是為linuxsir.org.txt文件輸入內(nèi)容;
> 北南南北 測試; 注:這是為linuxsir.org.txt文件輸入內(nèi)容;
> EOF 注:退出編輯狀態(tài);
[root@localhost ~]# cat linuxsir.org.txt 注:我們查看一下linuxsir.org.txt文件的內(nèi)容;
我來測試 cat 創(chuàng)建文件,并且為文件輸入內(nèi)容;
北南南北 測試;
cat 還有向已存在的文件追加內(nèi)容的功能;
[root@localhost ~]# cat linuxsir.txt 注:查看已存在的文件linuxsir.txt 內(nèi)容;
I am BeiNanNanBei From LinuxSir.Org . 注:內(nèi)容行
我正在為cat命令寫文檔
[root@localhost ~]# cat >> linuxsir.txt << EOF 注:我們向linuxsir.txt文件追加內(nèi)容;
> 我來測試cat向文檔追加內(nèi)容的功能; 注:這是追回的內(nèi)容
> OK?
> OK~
> 北南 呈上
> EOF 注:以EOF退出;
[root@localhost ~]# cat linuxsir.txt 注:查看文件內(nèi)容,看是否追回成功。
I am BeiNanNanBei From LinuxSir.Org .
我正在為cat命令寫文檔
我來測試cat向文檔追加內(nèi)容的功能;
OK?
OK~
北南 呈上
假設(shè)我們有sir01.txt、sir02.tx和sir03.txt ,并且內(nèi)容如下;
[root@localhost ~]# cat sir01.txt
123456
i am testing
[root@localhost ~]# cat sir02.txt
56789
BeiNan Tested
[root@localhost ~]# cat sir03.txt
09876
linuxsir.org testing
我想通過cat 把sir01.txt、sir02.txt及sir03.txt 三個(gè)文件連接在一起(也就是說把這三個(gè)文件的內(nèi)容都接在一起)并輸出到一個(gè)新的文件sir04.txt 中。
注意:其原理是把三個(gè)文件的內(nèi)容連接起來,然后創(chuàng)建sir04.txt文件,并且把幾個(gè)文件的內(nèi)容同時(shí)寫入sir04.txt中。特別值得一提的是,如果您輸入到一個(gè)已經(jīng)存在的sir04.txt 文件,會(huì)把sir04.txt內(nèi)容清空。
[root@localhost ~]# cat sir01.txt sir02.txt sir03.txt > sir04.txt
[root@localhost ~]# more sir04.txt
123456
i am testing
56789
BeiNan Tested
09876
linuxsir.org testing
cat 把一個(gè)或多個(gè)已存在的文件內(nèi)容,追加到一個(gè)已存在的文件中
[root@localhost ~]# cat sir00.txt
linuxsir.org forever
[root@localhost ~]# cat sir01.txt sir02.txt sir03.txt >> sir00.txt
[root@localhost ~]# cat sir00.txt
linuxsir.org forever
123456
i am testing
56789
BeiNan Tested
09876
linuxsir.org testing
警告:我們要知道>意思是創(chuàng)建,>>是追加。千萬不要弄混了。造成失誤可不是鬧著玩的;
2、more 文件內(nèi)容或輸出查看工具;
more 是我們最常用的工具之一,最常用的就是顯示輸出的內(nèi)容,然后根據(jù)窗口的大小進(jìn)行分頁顯示,然后還能提示文件的百分比;
[root@localhost ~]# more /etc/profile
2.1 more 的語法、參數(shù)和命令;
more [參數(shù)選項(xiàng)] [文件]
參數(shù)如下: +num 從第num行開始顯示; -num 定義屏幕大小,為num行; +/pattern 從pattern 前兩行開始顯示; -c 從頂部清屏然后顯示; -d 提示Press space to continue, 'q' to quit.(按空格鍵繼續(xù),按q鍵退出),禁用響鈴功能; -l 忽略Ctrl+l (換頁)字符; -p 通過清除窗口而不是滾屏來對(duì)文件進(jìn)行換頁。和-c參數(shù)有點(diǎn)相似; -s 把連續(xù)的多個(gè)空行顯示為一行; -u 把文件內(nèi)容中的下劃線去掉
退出more的動(dòng)作指令是q
2.2 more 的參數(shù)應(yīng)用舉例;
[root@localhost ~]# more -dc /etc/profile 注:顯示提示,并從終端或控制臺(tái)頂部顯示;
[root@localhost ~]# more +4 /etc/profile 注:從profile的第4行開始顯示;
[root@localhost ~]# more -4 /etc/profile 注:每屏顯示4行;
[root@localhost ~]# more +/MAIL /etc/profile 注:從profile中的第一個(gè)MAIL單詞的前兩行開始顯示;
2.3 more 的動(dòng)作指令;
我們查看一個(gè)內(nèi)容較大的文件時(shí),要用到more的動(dòng)作指令,比如ctrl+f(或空格鍵) 是向下顯示一屏,ctrl+b是返回上一屏; Enter鍵可以向下滾動(dòng)顯示n行,要通過定,默認(rèn)為1行;
我們只說幾個(gè)常用的; 自己嘗試一下就知道了;
Enter 向下n行,需要定義,默認(rèn)為1行; Ctrl+f 向下滾動(dòng)一屏; 空格鍵 向下滾動(dòng)一屏; Ctrl+b 返回上一屏; = 輸出當(dāng)前行的行號(hào); :f 輸出文件名和當(dāng)前行的行號(hào); v 調(diào)用vi編輯器; ! 命令 調(diào)用Shell,并執(zhí)行命令; q 退出more
當(dāng)我們查看某一文件時(shí),想調(diào)用vi來編輯它,不要忘記了v動(dòng)作指令,這是比較方便的;
2.4 其它命令通過管道和more結(jié)合的運(yùn)用例子;
比如我們列一個(gè)目錄下的文件,由于內(nèi)容太多,我們應(yīng)該學(xué)會(huì)用more來分頁顯示。這得和管道 | 結(jié)合起來,比如:
[root@localhost ~]# ls -l /etc |more
3、less 查看文件內(nèi)容 工具;
less 工具也是對(duì)文件或其它輸出進(jìn)行分頁顯示的工具,應(yīng)該說是linux正統(tǒng)查看文件內(nèi)容的工具,功能極其強(qiáng)大;您是初學(xué)者,我建議您用less。由于less的內(nèi)容太多,我們把最常用的介紹一下;
3.1 less的語法格式;
less [參數(shù)] 文件
常用參數(shù)
-c 從頂部(從上到下)刷新屏幕,并顯示文件內(nèi)容。而不是通過底部滾動(dòng)完成刷新;
-f 強(qiáng)制打開文件,二進(jìn)制文件顯示時(shí),不提示警告;
-i 搜索時(shí)忽略大小寫;除非搜索串中包含大寫字母;
-I 搜索時(shí)忽略大小寫,除非搜索串中包含小寫字母;
-m 顯示讀取文件的百分比;
-M 顯法讀取文件的百分比、行號(hào)及總行數(shù);
-N 在每行前輸出行號(hào);
-p pattern 搜索pattern;比如在/etc/profile搜索單詞MAIL,就用 less -p MAIL /etc/profile
-s 把連續(xù)多個(gè)空白行作為一個(gè)空白行顯示;
-Q 在終端下不響鈴;
比如:我們?cè)陲@示/etc/profile的內(nèi)容時(shí),讓其顯示行號(hào);
[root@localhost ~]# less -N /etc/profile
3.2 less的動(dòng)作命令;
進(jìn)入less后,我們得學(xué)幾個(gè)動(dòng)作,這樣更方便 我們查閱文件內(nèi)容;最應(yīng)該記住的命令就是q,這個(gè)能讓less終止查看文件退出;
動(dòng)作
回車鍵 向下移動(dòng)一行;
y 向上移動(dòng)一行;
空格鍵 向下滾動(dòng)一屏;
b 向上滾動(dòng)一屏;
d 向下滾動(dòng)半屏;
h less的幫助;
u 向上洋動(dòng)半屏;
w 可以指定顯示哪行開始顯示,是從指定數(shù)字的下一行顯示;比如指定的是6,那就從第7行顯示;
g 跳到第一行;
G 跳到最后一行;
p n% 跳到n%,比如 10%,也就是說比整個(gè)文件內(nèi)容的10%處開始顯示;
/pattern 搜索pattern ,比如 /MAIL表示在文件中搜索MAIL單詞;
v 調(diào)用vi編輯器;
q 退出less
!command 調(diào)用SHELL,可以運(yùn)行命令;比如!ls 顯示當(dāng)前列當(dāng)前目錄下的所有文件;
就less的動(dòng)作來說,內(nèi)容太多了,用的時(shí)候查一查man less是最好的。在這里就不舉例子了;
4、head 工具,顯示文件內(nèi)容的前幾行;
head 是顯示一個(gè)文件的內(nèi)容的前多少行;
用法比較簡單;
head -n 行數(shù)值 文件名;
比如我們顯示/etc/profile的前10行內(nèi)容,應(yīng)該是:
[root@localhost ~]# head -n 10 /etc/profile
5、tail 工具,顯示文件內(nèi)容的最后幾行;
tail 是顯示一個(gè)文件的內(nèi)容的前多少行;
用法比較簡單;
tail -n 行數(shù)值 文件名;
比如我們顯示/etc/profile的最后5行內(nèi)容,應(yīng)該是:
[root@localhost ~]# tail -n 5 /etc/profile
Oracle中不同啟動(dòng)和關(guān)閉方式的區(qū)別
Oracle數(shù)據(jù)庫提供了幾種不同的數(shù)據(jù)庫啟動(dòng)和關(guān)閉方式,本文將周詳介紹這些啟動(dòng)和關(guān)閉方式之間的區(qū)別連同他們各自不同的功能。
一、啟動(dòng)和關(guān)閉Oracle數(shù)據(jù)庫
對(duì)于大多數(shù)Oracle DBA來說,啟動(dòng)和關(guān)閉Oracle數(shù)據(jù)庫最常用的方式就是在命令行方式下的Server Manager。從Oracle 8i以后,系統(tǒng)將Server Manager的任何功能都集中到了SQL*Plus中,也就是說從8i以后對(duì)于數(shù)據(jù)庫的啟動(dòng)和關(guān)閉能夠直接通過SQL*Plus來完成,而不再另外需要Server Manager,但系統(tǒng)為了保持向下兼容,依舊保留了Server Manager工具。另外也可通過圖像用戶工具(GUI)的Oracle Enterprise Manager來完成系統(tǒng)的啟動(dòng)和關(guān)閉,圖像用戶界面Instance Manager很簡單,這里不再詳述。
要啟動(dòng)和關(guān)閉數(shù)據(jù)庫,必須要以具備Oracle 管理員權(quán)限的用戶登陸,通常也就是以具備SYSDBA權(quán)限的用戶登陸。一般我們常用INTERNAL用戶來啟動(dòng)和關(guān)閉數(shù)據(jù)庫(INTERNAL用戶實(shí)際上是SYS用戶以SYSDBA連接的同義詞)。Oracle數(shù)據(jù)庫的新版本將逐步淘汰INTERNAL這個(gè)內(nèi)部用戶,所以我們最好還是配置DBA用戶具備SYSDBA權(quán)限。
二、數(shù)據(jù)庫的啟動(dòng)(STARTUP)
啟動(dòng)一個(gè)數(shù)據(jù)庫需要三個(gè)步驟:
1、 創(chuàng)建一個(gè)Oracle實(shí)例(非安裝階段)
2、 由實(shí)例安裝數(shù)據(jù)庫(安裝階段)
3、 打開數(shù)據(jù)庫(打開階段)
在Startup命令中,能夠通過不同的選項(xiàng)來控制數(shù)據(jù)庫的不同啟動(dòng)步驟。
1、STARTUP NOMOUNT
NOMOUNT選項(xiàng)僅僅創(chuàng)建一個(gè)Oracle實(shí)例。讀取init.ora初始化參數(shù)文檔、啟動(dòng)后臺(tái)進(jìn)程、初始化系統(tǒng)全局區(qū)(SGA)。Init.ora文檔定義了實(shí)例的配置,包括內(nèi)存結(jié)構(gòu)的大小和啟動(dòng)后臺(tái)進(jìn)程的數(shù)量和類型等。實(shí)例名根據(jù)Oracle_SID配置,不一定要和打開的數(shù)據(jù)庫名稱相同。當(dāng)實(shí)例打開后,系統(tǒng)將顯示一個(gè)SGA內(nèi)存結(jié)構(gòu)和大小的列表,如下所示:
SQL> startup nomount
ORACLE 例程已啟動(dòng)。
Total System Global Area 35431692 bytes
Fixed Size 70924 bytes
Variable Size 18505728 bytes
Database Buffers 16777216 bytes
Redo Buffers 77824 bytes
2、STARTUP MOUNT
該命令創(chuàng)建實(shí)例并且安裝數(shù)據(jù)庫,但沒有打開數(shù)據(jù)庫。Oracle系統(tǒng)讀取控制文檔中關(guān)于數(shù)據(jù)文檔和重作日志文檔的內(nèi)容,但并不打開該文檔。這種打開方式常在數(shù)據(jù)庫維護(hù)操作中使用,如對(duì)數(shù)據(jù)文檔的更名、改變重作日志連同打開歸檔方式等。在這種打開方式下,除了能夠看到SGA系統(tǒng)列表以外,系統(tǒng)還會(huì)給出"數(shù)據(jù)庫裝載完畢"的提示。
3、STARTUP
該命令完成創(chuàng)建實(shí)例、安裝實(shí)例和打開數(shù)據(jù)庫的任何三個(gè)步驟。此時(shí)數(shù)據(jù)庫使數(shù)據(jù)文檔和重作日志文檔在線,通常還會(huì)請(qǐng)求一個(gè)或是多個(gè)回滾段。這時(shí)系統(tǒng)除了能夠看到前面Startup Mount方式下的任何提示外,還會(huì)給出一個(gè)"數(shù)據(jù)庫已打開"的提示。此時(shí),數(shù)據(jù)庫系統(tǒng)處于正常工作狀態(tài),能夠接受用戶請(qǐng)求。
假如采用STARTUP NOMOUNT或是STARTUP MOUNT的數(shù)據(jù)庫打開命令方式,必須采用ALTER DATABASE命令來執(zhí)行打開數(shù)據(jù)庫的操作。例如,假如您以STARTUP NOMOUNT方式打開數(shù)據(jù)庫,也就是說實(shí)例已創(chuàng)建,但是數(shù)據(jù)庫沒有安裝和打開。這是必須運(yùn)行下面的兩條命令,數(shù)據(jù)庫才能正確啟動(dòng)。
ALTER DATABASE MOUNT;
ALTER DATABASE OPEN;
而假如以STARTUP MOUNT方式啟動(dòng)數(shù)據(jù)庫,只需要運(yùn)行下面一條命令即能夠打開數(shù)據(jù)庫:
ALTER DATABASE OPEN.
4、其他打開方式
除了前面介紹的三種數(shù)據(jù)庫打開方式選項(xiàng)外,更有另外其他的一些選項(xiàng)。
(1) STARTUP RESTRICT
這種方式下,數(shù)據(jù)庫將被成功打開,但僅僅允許一些特權(quán)用戶(具備DBA角色的用戶)才能夠使用數(shù)據(jù)庫。這種方式常用來對(duì)數(shù)據(jù)庫進(jìn)行維護(hù),如數(shù)據(jù)的導(dǎo)入/導(dǎo)出操作時(shí)不希望有其他用戶連接到數(shù)據(jù)庫操作數(shù)據(jù)。
(2) STARTUP FORCE
該命令其實(shí)是強(qiáng)行關(guān)閉數(shù)據(jù)庫(shutdown abort)和啟動(dòng)數(shù)據(jù)庫(startup)兩條命令的一個(gè)綜合。該命令僅在關(guān)閉數(shù)據(jù)庫碰到問題不能關(guān)閉數(shù)據(jù)庫時(shí)采用。
(3) ALTER DATABASE OPEN READ ONLY;
該命令在創(chuàng)建實(shí)例連同安裝數(shù)據(jù)庫后,以只讀方式打開數(shù)據(jù)庫。對(duì)于那些僅僅提供查詢功能的產(chǎn)品數(shù)據(jù)庫能夠采用這種方式打開。
三、數(shù)據(jù)庫的關(guān)閉(SHUTDOWN)
對(duì)于數(shù)據(jù)庫的關(guān)閉,有四種不同的關(guān)閉選項(xiàng),下面對(duì)其進(jìn)行一一介紹。
1、SHUTDOWN NORMAL
這是數(shù)據(jù)庫關(guān)閉SHUTDOWN命令的確省選項(xiàng)。也就是說假如您發(fā)出SHUTDOWN這樣的命令,也即是SHUTDOWN NORNAL的意思。
發(fā)出該命令后,任何新的連接都將再不允許連接到數(shù)據(jù)庫。在數(shù)據(jù)庫關(guān)閉之前,Oracle將等待現(xiàn)在連接的任何用戶都從數(shù)據(jù)庫中退出后才開始關(guān)閉數(shù)據(jù)庫。采用這種方式關(guān)閉數(shù)據(jù)庫,在下一次啟動(dòng)時(shí)無需進(jìn)行任何的實(shí)例恢復(fù)。但需要注意一點(diǎn)的是,采用這種方式,也許關(guān)閉一個(gè)數(shù)據(jù)庫需要幾天時(shí)間,也許更長。
2、SHUTDOWN IMMEDIATE
這是我們常用的一種關(guān)閉數(shù)據(jù)庫的方式,想很快地關(guān)閉數(shù)據(jù)庫,但又想讓數(shù)據(jù)庫干凈的關(guān)閉,常采用這種方式。
當(dāng)前正在被Oracle處理的SQL語句立即中斷,系統(tǒng)中任何沒有提交的事務(wù)全部回滾。假如系統(tǒng)中存在一個(gè)很長的未提交的事務(wù),采用這種方式關(guān)閉數(shù)據(jù)庫也需要一段時(shí)間(該事務(wù)回滾時(shí)間)。系統(tǒng)不等待連接到數(shù)據(jù)庫的任何用戶退出系統(tǒng),強(qiáng)行回滾當(dāng)前任何的活動(dòng)事務(wù),然后斷開任何的連接用戶。
3、SHUTDOWN TRANSACTIONAL
該選項(xiàng)僅在Oracle 8i后才能夠使用。該命令常用來計(jì)劃關(guān)閉數(shù)據(jù)庫,他使當(dāng)前連接到系統(tǒng)且正在活動(dòng)的事務(wù)執(zhí)行完畢,運(yùn)行該命令后,任何新的連接和事務(wù)都是不允許的。在任何活動(dòng)的事務(wù)完成后,數(shù)據(jù)庫將和SHUTDOWN IMMEDIATE同樣的方式關(guān)閉數(shù)據(jù)庫。
4、SHUTDOWN ABORT
這是關(guān)閉數(shù)據(jù)庫的最后一招,也是在沒有任何辦法關(guān)閉數(shù)據(jù)庫的情況下才不得不采用的方式,一般不要采用。假如下列情況出現(xiàn)時(shí)能夠考慮采用這種方式關(guān)閉數(shù)據(jù)庫。
1、 數(shù)據(jù)庫處于一種非正常工作狀態(tài),不能用shutdown normal或shutdown immediate這樣的命令關(guān)閉數(shù)據(jù)庫;
2、 需要立即關(guān)閉數(shù)據(jù)庫;
3、 在啟動(dòng)數(shù)據(jù)庫實(shí)例時(shí)碰到問題;
任何正在運(yùn)行的SQL語句都將立即中止。任何未提交的事務(wù)將不回滾。Oracle也不等待現(xiàn)在連接到數(shù)據(jù)庫的用戶退出系統(tǒng)。下一次啟動(dòng)數(shù)據(jù)庫時(shí)需要實(shí)例恢復(fù),因此,下一次啟動(dòng)可能比平時(shí)需要更多的時(shí)間。
表1能夠清楚地看到上述四種不同關(guān)閉數(shù)據(jù)庫的區(qū)別和聯(lián)系。
關(guān)閉方式 A I T N
允許新的連接 × × × ×
等待直到當(dāng)前會(huì)話中止 × × × √
等待直到當(dāng)前事務(wù)中止 × × √ √
強(qiáng)制CheckPoint,關(guān)閉任何文檔 × √ √ √
其中:A-Abort I-Immediate T-Transaction N-Nornal
pl/sql developer的Commander Windows下執(zhí)行shutdown命令報(bào)“ORA-00900: 無效 SQL 語句”,
但在服務(wù)器本地sqlplus下卻可以執(zhí)行關(guān)閉數(shù)據(jù)庫命令,PL/SQL DEVELOPER只支持部分的sql*plus命令?
另外在數(shù)據(jù)庫unmount(instance 已經(jīng)啟動(dòng))的情況下,PL/SQL DEVELOPER無法連接上,
報(bào)“ORA-12528: TNS:監(jiān)聽程序:所有適用例程都無法建立新連接”。
在instance已經(jīng)啟動(dòng)但數(shù)據(jù)庫還沒mount的情況下PL/SQL DEVELOPER等客戶端都無法連接到實(shí)例上
如何查看Oracle當(dāng)前數(shù)據(jù)庫實(shí)例名
數(shù)據(jù)庫實(shí)例名在編程的很多地方都需要用到,配置數(shù)據(jù)庫的jdbc:oracle:thin:@192.168.2.1:1521:WW ,還有sqlPlus的連接字符串中也需要用到 conn sys/password@WW as sysdba; 如何查看當(dāng)前數(shù)據(jù)庫實(shí)例名呢?方式有三:
·使用SQL語句:select instance_name from v$instance;
·使用show命令:show parameter instance
·查看參數(shù)文件:查看init.ora文件
通過視圖實(shí)現(xiàn)來至兩個(gè)不同數(shù)據(jù)庫的表的結(jié)構(gòu)完全一致, 在結(jié)構(gòu)完全相同的兩個(gè)表之間進(jìn)行數(shù)據(jù)同步, 問題變得相當(dāng)簡單. 同步代碼如下.
---初始同步
delete from ods_table;
insert into v_table
select * from db_table;
commit;
---新增同步
insert into v_table
select * from db_table t
where t.id not in (select id from v_table);
commit;
---變更同步
update ods_table t
set t.c_number = (select db.c_number from db_table db where db.id = t.id)
where t.c_number != (select db.c_number from db_table db where db.id = t.id);
commit;
CREATE SEQUENCE SEQ_ETL_INCREASE_ID
INCREMENT BY 1
START WITH 1
NOCACHE;
/*==============================================================*/
/* Table: ETL_TABLES */
/*==============================================================*/
CREATE TABLE ETL_TABLES (
"ID" NUMBER DEFAULT -1 NOT NULL,
"TABLE_NAME" VARCHAR2(100) NOT NULL,
"TABLE_TYPE" VARCHAR2(30) NOT NULL,
"TABLE_ROOT_IN" VARCHAR2(30),
"TABLE_NEED_CREATE_VIEW" NUMBER DEFAULT 1,
"TABLE_CREATE_VIEW_NAME_PREFIX" VARCHAR2(30) DEFAULT 'v',
"DB_LINK_NAME" VARCHAR2(100),
"CURRENT_VERSION" NUMBER DEFAULT 1 NOT NULL,
"VERSION_HISTORY" VARCHAR2(3000) DEFAULT 'init input' NOT NULL,
"DEVELOP_DATE" DATE DEFAULT SYSDATE NOT NULL,
"DEVELOP_BY" VARCHAR2(100) DEFAULT 'cyyan@isoftstone' NOT NULL,
"LAST_MAINTAIN_DATE" DATE DEFAULT SYSDATE NOT NULL,
"LAST_MAINTAIN_BY" VARCHAR2(100) DEFAULT 'cyyan@isoftstone' NOT NULL,
"MEMO" VARCHAR2(500),
"STATUS" NUMBER DEFAULT 1,
CONSTRAINT PK_ETL_TABLES PRIMARY KEY ("ID")
);
COMMENT ON TABLE ETL_TABLES IS
'此表用于維護(hù)ETL涉及到所有表, 包括:
1, db---業(yè)務(wù)系統(tǒng)數(shù)據(jù)庫
2, ods---操作數(shù)據(jù)數(shù)據(jù)庫
3, dw---數(shù)據(jù)倉庫';
/*==============================================================*/
/* Table: ETL_VIEWS */
/*==============================================================*/
CREATE TABLE ETL_VIEWS (
"ID" NUMBER DEFAULT -1 NOT NULL,
"VIEW_NAME" VARCHAR2(100) NOT NULL,
"VIEW_TYPE" VARCHAR2(30) NOT NULL,
"VIEW_ROOT_IN" VARCHAR2(30),
"VIEW_SELECT" VARCHAR2(4000) NOT NULL,
"VIEW_FROM" VARCHAR2(600) NOT NULL,
"VIEW_WHERE" VARCHAR2(2000),
"VIEW_ORDER_BY" VARCHAR2(600),
"VIEW_GROUP_BY" VARCHAR2(600),
"VIEW_HAVING" VARCHAR2(600),
"VIEW_DB_LINK_NAME" VARCHAR2(100),
"CURRENT_VERSION" NUMBER DEFAULT 1 NOT NULL,
"VERSION_HISTORY" VARCHAR2(3000) DEFAULT 'init input' NOT NULL,
"DEVELOP_DATE" DATE DEFAULT SYSDATE NOT NULL,
"DEVELOP_BY" VARCHAR2(100) DEFAULT 'cyyan@isoftstone' NOT NULL,
"LAST_MAINTAIN_DATE" DATE DEFAULT SYSDATE NOT NULL,
"LAST_MAINTAIN_BY" VARCHAR2(100) DEFAULT 'cyyan@isoftstone' NOT NULL,
"MEMO" VARCHAR2(500),
"STATUS" NUMBER DEFAULT 1,
CONSTRAINT PK_ETL_VIEWS PRIMARY KEY ("ID")
);
COMMENT ON TABLE ETL_VIEWS IS
'此表用于維護(hù)ETL涉及到所有視圖, 包括:
1, v1---db表中與ods對(duì)應(yīng)到視圖
2, v2---ods表中與db對(duì)應(yīng)到視圖
3, v3---ods表中與dw對(duì)應(yīng)到視圖
4, v4---dw表中與ods中對(duì)應(yīng)到視圖';
/*==============================================================*/
/* Table: ETLS */
/*==============================================================*/
CREATE TABLE ETLS (
"ID" NUMBER NOT NULL,
"ETL_NAME" VARCHAR2(300) NOT NULL,
"ETL_TYPE" VARCHAR2(30) NOT NULL,
"ETL_SRC_VIEW_OR_TABLE" NUMBER NOT NULL,
"ETL_DES_VIEW_OR_TABLE" NUMBER NOT NULL,
"ETL_INIT_ENABLE" NUMBER(1) DEFAULT 1 NOT NULL,
"ETL_ADD_ENABLE" NUMBER(1) DEFAULT 1 NOT NULL,
"ETL_CHARGE_ENABLE" NUMBER(1) DEFAULT 1 NOT NULL,
"CURRENT_VERSION" NUMBER DEFAULT 1 NOT NULL,
"VERSION_HISTORY" VARCHAR2(3000) DEFAULT 'init input' NOT NULL,
"DEVELOP_DATE" DATE DEFAULT SYSDATE NOT NULL,
"DEVELOP_BY" VARCHAR2(100) DEFAULT 'cyyan@isoftstone' NOT NULL,
"LAST_MAINTAIN_DATE" DATE DEFAULT SYSDATE NOT NULL,
"LAST_MAINTAIN_BY" VARCHAR2(100) DEFAULT 'cyyan@isoftstone' NOT NULL,
"MEMO" VARCHAR2(500),
"STATUS" NUMBER DEFAULT 1,
CONSTRAINT PK_ETLS PRIMARY KEY ("ID")
);
COMMENT ON TABLE ETLS IS
'此表用于維護(hù)ETL轉(zhuǎn)換時(shí)設(shè)計(jì)到源表和目的表
源表(或視圖)--->目的表(或視圖)-
(推薦全部使用視圖, 視圖具有更過到靈活性, 而且更統(tǒng)一)
整體架構(gòu)是在完全相同兩張表(或視圖)之間進(jìn)行同步處理
規(guī)范:
1, 源表(或視圖)-和目的表(或視圖)-完全相同
2, 目的視圖必須是單表';