① linux shell 腳本 間接獲取輸入參數的方法
如果是bash,可以用indirect expansion來搞,語法為 ${!var}。
比如
foo=bar
bar=123
echo ${!foo}
會列印 123
再比如下面的腳本,依次列印腳本的各個輸入參數。
#!/bin/bash
var=1
while [ $var -le $# ]
do
echo "Param $var is ${!var}"
let var++
done
不用indirect expansion,也可以用 eval, 比如
#!/bin/bash
var=1
while [ $var -le $# ]
do
eval echo "Param $var is \$$var"
let var++
done
② linux Shell編程中常用的數學計算方法:expr,let,bc及其他。哪個效率更高一點
從效率來說let==$(()) > expr > bc,這個是絕對的。
let和$(())運行是內建命令,使用相同的演算法。
expr和bc是外部程序,expr的體積幾乎等於bc的1/3,執行一次裝入內存所消耗的時間就不一樣。
從運算能力來說,自然bc排第一位。
其實還有awk,能更好的執行基本運算、匯總、求平均等更復雜的。而且還可以使用數組、哈希表。
③ Linux expect
expect:expect是Unix系統中用來進行自動化控制和測試的腳本工具,常用於實現互動式任務的自動化。使用命令」dnf install expect -y」進行安裝。腳本文件聲明為」#!/usr/bin/expect」。
expect常用命令如下:
1.spawn+交互命令(如spawn ssh [email protected]):」spawn」是expect的初始命令,用於啟動一個新的交互進程,之後所有的操作都會在這個進程中進行。
2.set:定義變數/為變數賦值。使用語法:set 變數名 值。
3.puts:將變數值/字元串定向到本地標准輸出文件(即定位到屏幕)。使用語法:puts 「字元串/$變數名」
4.send_user:作用和使用方法類似於」puts」,區別在於」puts」會在輸出內容的結尾自動追加一個換行符,而」send_user」不會。
5.send:向交互進程發送信息/命令(字元串和一些特殊符號,\r—回車,\n—換行,\t—製表符)。使用語法:send 「信息/命令[\r]」。
6.[lindex $argv 數字]:表示外部傳遞參數的值,數字是n,就表示第n-1個參數。註:$argc表示外部傳遞參數的個數,也是一個值。
7.expect+字元串+{ 命令 }:將字元串與交換進程接收到的信息進行匹配。如果匹配成功(字元串是交換進程接收到的信息的一部分),執行包含在」{}」中的命令;如果匹配失敗,不執行包含在」{}」中的命令。該命令有三種使用方法:
第一種:單分支模式
①expect 字元串 { 命令 }
解釋:如果字元串與交換進程接收到的信息匹配成功,執行包含在」{}」中的命令,並結束該expect命令;如果字元串與交換進程接收到的信息匹配失敗,timeout秒後結束該expect命令。(註:腳本執行到expect命令時,計時器就開始計時,並會在計時器超時前不斷對交換進程接收到的信息進行掃描,嘗試字元串與信息的匹配。)
②expect {
字元串{ 命令 }
timeout { 命令 }
}
解釋:如果字元串與交換進程接收到的信息匹配成功,執行包含在」{}」中的命令,並結束該expect命令;如果字元串與交換進程接收到的信息匹配失敗,timeout秒後執行包含在」{}」中的命令,之後結束該expect命令。(註:腳本執行到expect命令時,計時器就開始計時,並會在計時器超時前不斷對交換進程接收到的信息進行掃描,嘗試字元串與信息的匹配。)
第二種:多分支模式
①expect {
字元串1 { 命令 }
字元串2 { 命令 }
}
解釋:如果字元串1與交換進程接收到的信息匹配成功,執行執行包含在」{}」中的命令,並結束該expect命令;如果字元串1與交換進程接收到的信息匹配失敗、字元串2與交換進程接收到的信息匹配成功,執行包含在」{}」中的命令,並結束該expect命令;如果字元串1、字元串2皆與交換進程接收到的信息匹配失敗,timeout秒後結束該expect命令。(註:腳本執行到expect命令時,計時器就開始計時,並會在計時器超時前不斷對交換進程接收到的信息進行掃描,嘗試字元串與信息的匹配。)
②expect {
字元串1 { 命令 }
字元串2 { 命令 }
timeout { 命令 }
}
解釋:如果字元串1與交換進程接收到的信息匹配成功,執行執行包含在」{}」中的命令,並結束該expect命令;如果字元串1與交換進程接收到的信息匹配失敗、字元串2與交換進程接收到的信息匹配成功,執行執行包含在」{}」中的命令,並結束該expect命令;如果字元串1、字元串2皆與交換進程接收到的信息匹配失敗,timeout秒後執行包含在」{}」中的命令,之後結束該expect命令。(註:腳本執行到expect命令時,計時器就開始計時,並會在計時器超時前不斷對交換進程接收到的信息進行掃描,嘗試字元串與信息的匹配。)
第三種:循環多分支模式(註:exp_continue命令只能出現在expect命令的匹配語句中,執行到exp_continue命令時,腳本會跳出當前expect命令,並重新執行該expect命令,直到expect命令通過不包含exp_continue命令的匹配語句結束、或expect命令匹配超時結束。)
①expect {
字元串1 { 命令; exp_continue }
字元串2 { 命令 }
}
解釋:如果字元串1與交換進程接收到的信息匹配成功,執行執行包含在」{}」中的命令,並重新執行該expect命令;如果字元串1與交換進程接收到的信息匹配成功,執行執行包含在」{}」中的命令,並重新執行該expect命令...;如果字元串1與交換進程接收到的信息匹配失敗、字元串2與交換進程接收到的信息匹配成功,執行包含在」{}」中的命令,並結束該expect命令;如果字元串1、字元串2皆與交換進程接收到的信息匹配失敗,timeout秒後結束該expect命令。(註:腳本執行到expect命令時,計時器就開始計時,並會在計時器超時前不斷對交換進程接收到的信息進行掃描,嘗試字元串與信息的匹配。)
②expect {
字元串1 { 命令; exp_continue }
字元串2 { 命令 }
timeout { 命令 }
}
解釋:如果字元串1與交換進程接收到的信息匹配成功,執行執行包含在」{}」中的命令,並重新執行該expect命令;如果字元串1與交換進程接收到的信息匹配成功,執行執行包含在」{}」中的命令,並重新執行該expect命令...;如果字元串1與交換進程接收到的信息匹配失敗、字元串2與交換進程接收到的信息匹配成功,執行包含在」{}」中的命令,並結束該expect命令;如果字元串1、字元串2皆與交換進程接收到的信息匹配失敗,timeout秒後執行包含在」{}」中的命令,之後結束該expect命令。(註:腳本執行到expect命令時,計時器就開始計時,並會在計時器超時前不斷對交換進程接收到的信息進行掃描,嘗試字元串與信息的匹配。)
8.timeout:timeout是expect中的一個關鍵字變數,用於控制expect命令的超時時間。需要注意的是,這個超時時間針對於整個expect命令,而不是針對於expect命令中的某條匹配語句。也就是說,只有expect命令中所有匹配語句都匹配失敗後,才會開始計算超時時間。timeout變數值預設為10(秒),我們可以通過」set timeout=值」的方式為其重新賦值,作用范圍:本次賦值到下一次賦值間的所有expect命令。註:如果需要為timeout變數重新賦值,應在expect命令之外進行。
9.expect eof:該命令的作用是結束spawn交互進程,將命令行切回至運行腳本的主機(即從遠端伺服器登出)。
10.interact:預設情況下,expect腳本執行完畢後會自動從遠端伺服器登出(即便沒有顯式地執行」expect eof」命令)。使用interact命令後,expect腳本執行完畢會繼續保持當前狀態,並將控制權移交給用戶。
11.exit:結束該腳本。
expect中的if語句:
if { 條件表達式 } {
命令
}
if { 條件表達式 } {
命令
} else {
命令
}
expect中的while語句:
while { 條件表達式 } {
命令
}
expect中的for語句:
for { set i 1 } { $i <=10 } { incr i } {
命令
}
incr變數名 步長 ——變數自增
incr 變數名 -步長 ——變數自減
數學運算需使用let、expr等工具
④ Unix expr 命令怎麼進行小數點計算,返回有小數點的結果
1:使用 expr 外部程式
加法 r=`expr 4 + 5`
echo $r
注意! '4' '+' '5' 這三者之間要有空白
r=`expr 4 * 5` #錯誤
乘法 r=`expr 4 \* 5`
帶括弧的
expr \( 5 - 3 \) \* 3 + 1
2:使用 $(( ))
r=$(( 4 + 5 ))
echo $r
3:使用 $[ ]
r=$[ 4 + 5 ]
echo $r
乘法
r=`expr 4 \* 5`
r=$(( 4 * 5 ))
r=$[ 4 * 5 ]
echo $r
除法
r=`expr 40 / 5`
r=$(( 40 / 5 ))
r=$[ 40 / 5 ]
echo $r
減法
r=`expr 40 - 5`
r=$(( 40 - 5 ))
r=$[ 40 - 5 ]
echo $r
求余數
r=$[ 100 % 43 ]
echo $r
乘冪 (如 2 的 3 次方)
r=$(( 2 ** 3 ))
r=$[ 2 ** 3 ]
echo $r
註:expr 沒有乘冪
4:使用let 命令
加法:
n=10
let n=n+1
echo $n #n=11
乘法:
let m=n*10
echo $m
除法:
let r=m/10
echo $r
求余數:
let r=m%7
echo $r
乘冪:
let r=m**2
echo $r
雖然Bash shell 有四種算術運算方法,但並不是每一種都是跨的,建議使用expr。
另外,我們在 script 中經常有加1操作,以下四法皆可:
m=$[ m + 1]
m=`expr $m + 1`
m=$(($m + 1))
let m=m+1
另外,還可以使用bc
m=`echo "( $a - 1 )*$b +1" |bc`
⑤ linux shell編程中怎麼判斷時間相等
#!/bin/bash#格式化過期日期,格式化過期日期完整時間以當前時間作為參考!expday="2018-04-11 `date +%T`"echo "Expire day is $expday"#當前日期時間格式為stamp時間戳todays=`date +%s`echo "Today is $(date +"%F %T")"#以下2種方式做時間的四則運算,分別使用 let 或者 $(( ))#過期日期已格式化,規避整數運算的誤差(去余數)#let dayDiff=($(date -d "$expday" +%s)-$todays)/86400dayDiff=$(( ($(date -d "$expday" +%s)-$todays)/86400 ))echo "Diff day is $dayDiff days!"
其餘說明:
bash 不支持浮點運算,如果需要進行浮點運算,需要藉助bc,awk 處理。Linux命令需求的話可如下圖進行查詢
⑥ vim+ctags只刪除tags中當前xxx.c文件的記錄
可以解決,主要問題是你要合理拆分 tags的分布。
方案1:
工程太大你可以利用makefile文件來更新tags哦。應該會寫makefile文件吧。
makefile中寫上tags 的依賴列表。
把tags 拆分到各個模塊下面,這樣tags 不會像方案2一樣太零散。
-------
方案2:
在工程目錄下的每個文件夾下都產生一個tags文件。
在vim配置文件中寫上
function Update_ctags()
let l:filepath=expand("%:p:h")
let l:cmd="!cd " . l:filepath . ";ctags -F *"
silent execute l:cmd
endfunc
auto BufWritePost *.c,*.h call Update_ctags()
" 只要寫入文件,就會更新文件所在目錄的tags,而它的子目錄下的tags不會更新。
「 假設 your_soft_src/ 是你工程根目錄的絕對路徑 。
" 接下來寫一個auto 命令自動設置工程目錄下的 tags list
auto bufenter your_soft_src/* so your_soft_src/tags_setting.vim
用這個linux命令 生成tags_setting.vim
echo -n "set tags+=">your_soft_src/tags_setting.vim
find your_soft_src -name tags|tr "\n" ",">>your_soft_src/tags_setting.vim
⑦ linux 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常用用法
[root@www ~]#grep[-acinv] [--color=auto]'搜尋字元串' filename
選項與參數:-a :將 binary 文件以 text 文件的方式搜尋數據-c :計算找到'搜尋字元串' 的次數-i :忽略大小寫的不同,所以大小寫視為相同-n :順便輸出行號-v :反向選擇,亦即顯示出沒有'搜尋字元串' 內容的那一行!--color=auto :可以將找到的關鍵詞部分加上顏色的顯示喔!
將/etc/passwd,有出現 root 的行取出來
# greproot /etc/passwdroot:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
或# cat/etc/passwd|grep root
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
將/etc/passwd,有出現 root 的行取出來,同時顯示這些行在/etc/passwd的行號
#grep-n root /etc/passwd1:root:x:0:0:root:/root:/bin/bash30:operator:x:11:0:operator:/root:/sbin/nologin
在關鍵字的顯示方面,grep 可以使用 --color=auto 來將關鍵字部分使用顏色顯示。 這可是個很不錯的功能啊!但是如果每次使用 grep 都得要自行加上 --color=auto 又顯的很麻煩~ 此時那個好用的 alias 就得來處理一下啦!你可以在 ~/.bashrc 內加上這行:『alias grep='grep --color=auto'』再以『 source ~/.bashrc 』來立即生效即可喔! 這樣每次運行 grep 他都會自動幫你加上顏色顯示啦
將/etc/passwd,將沒有出現 root 的行取出來
#grep-v root /etc/passwdroot:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
將/etc/passwd,將沒有出現 root 和nologin的行取出來
#grep-v root /etc/passwd|grep-v nologin
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
用 dmesg 列出核心信息,再以 grep 找出內含 eth 那行,要將捉到的關鍵字顯色,且加上行號來表示:
[root@www ~]# dmesg |grep-n --color=auto'eth'247:eth0: RealTek RTL8139 at0xee846000,00:90:cc:a6:34:84, IRQ10248:eth0: Identified8139chip type'RTL-8139C'294:eth0: link up, 100Mbps, full-plex, lpa0xC5E1305:eth0: no IPv6 routers present
# 你會發現除了 eth 會有特殊顏色來表示之外,最前面還有行號喔!
在關鍵字的顯示方面,grep 可以使用 --color=auto 來將關鍵字部分使用顏色顯示。 這可是個很不錯的功能啊!但是如果每次使用 grep 都得要自行加上 --color=auto 又顯的很麻煩~ 此時那個好用的 alias 就得來處理一下啦!你可以在 ~/.bashrc 內加上這行:『alias grep='grep --color=auto'』再以『 source ~/.bashrc 』來立即生效即可喔! 這樣每次運行 grep 他都會自動幫你加上顏色顯示啦
用 dmesg 列出核心信息,再以 grep 找出內含 eth 那行,在關鍵字所在行的前兩行與後三行也一起捉出來顯示
[root@www ~]# dmesg |grep-n -A3 -B2 --color=auto'eth'245-PCI: setting IRQ10as level-triggered246-ACPI: PCI Interrupt0000:00:0e.0[A] -> Link [LNKB] ...247:eth0: RealTek RTL8139 at0xee846000,00:90:cc:a6:34:84, IRQ10248:eth0: Identified8139chip type'RTL-8139C'249-input: PC Speaker as /class/input/input2250-ACPI: PCI Interrupt0000:00:01.4[B] -> Link [LNKB] ...251-hdb: ATAPI 48X DVD-ROM DVD-R-RAM CD-R/RW drive, 2048kB Cache, UDMA(66)
# 如上所示,你會發現關鍵字 247所在的前兩行及248 後三行也都被顯示出來!
# 這樣可以讓你將關鍵字前後數據捉出來進行分析啦!
根據文件內容遞歸查找目錄
#grep『energywise』 * #在當前目錄搜索帶'energywise'行的文件
# grep-r 『energywise』 * #在當前目錄及其子目錄下搜索'energywise'行的文件
# grep-l -r 『energywise』 * #在當前目錄及其子目錄下搜索'energywise'行的文件,但是不顯示匹配的行,只顯示匹配的文件
這幾個命令很使用,是查找文件的利器。
grep與正規表達式
字元類
字元類的搜索:如果我想要搜尋 test 或 taste 這兩個單字時,可以發現到,其實她們有共通的 't?st' 存在~這個時候,我可以這樣來搜尋:
[root@www ~]#grep-n't[ae]st' regular_express.txt8:I can't finish the test.9:Oh! The soup taste good.
其實 [] 裡面不論有幾個位元組,他都謹代表某『一個』位元組, 所以,上面的例子說明了,我需要的字串是『tast』或『test』兩個字串而已!
字元類的反向選擇 [^] :如果想要搜索到有 oo 的行,但不想要 oo 前面有 g,如下
[root@www ~]#grep-n'[^g]oo' regular_express.txt2:apple is my favorite food.3:Football game is not use feet only.18:google is the best toolsfor search keyword.19:goooooogle yes!
第 2,3 行沒有疑問,因為 foo 與 Foo 均可被接受!
但是第 18 行明明有 google 的 goo 啊~別忘記了,因為該行後面出現了 tool 的 too 啊!所以該行也被列出來~ 也就是說, 18 行裡面雖然出現了我們所不要的項目 (goo) 但是由於有需要的項目 (too) , 因此,是符合字串搜尋的喔!
至於第 19 行,同樣的,因為 goooooogle 裡面的 oo 前面可能是 o ,例如: go(ooo)oogle ,所以,這一行也是符合需求的!
字元類的連續:再來,假設我 oo 前面不想要有小寫位元組,所以,我可以這樣寫 [^abcd....z]oo , 但是這樣似乎不怎麼方便,由於小寫位元組的 ASCII 上編碼的順序是連續的, 因此,我們可以將之簡化為底下這樣:
[root@www ~]#grep-n'[^a-z]oo' regular_express.txt3:Football game is not use feet only.
也就是說,當我們在一組集合位元組中,如果該位元組組是連續的,例如大寫英文/小寫英文/數字等等, 就可以使用[a-z],[A-Z],[0-9]等方式來書寫,那麼如果我們的要求字串是數字與英文呢? 呵呵!就將他全部寫在一起,變成:[a-zA-Z0-9]。
我們要取得有數字的那一行,就這樣:
[root@www ~]#grep-n'[0-9]' regular_express.txt5:However, this dress is about $3183 dollars.15:You are the best is mean you are the no.1.
行首與行尾位元組 ^ $
行首字元:如果我想要讓 the 只在行首列出呢? 這個時候就得要使用定位位元組了!我們可以這樣做:
[root@www ~]#grep-n'^the' regular_express.txt12:the symbol'*'is represented as start.
此時,就只剩下第 12 行,因為只有第 12 行的行首是 the 開頭啊~此外, 如果我想要開頭是小寫位元組的那一行就列出呢?可以這樣:
[root@www ~]#grep-n'^[a-z]' regular_express.txt2:apple is my favorite food.4:this dress doesn't fit me.10:motorcycle is cheap than car.12:the symbol'*' is represented as start.18:google is the best toolsfor search keyword.19:goooooogle yes!20:go! go! Let's go.
如果我不想要開頭是英文字母,則可以是這樣:
[root@www ~]#grep-n'^[^a-zA-Z]' regular_express.txt1:"Open Source" is a good mechanism to develop programs.21:# I am VBird
^ 符號,在字元類符號(括弧[])之內與之外是不同的! 在 [] 內代表『反向選擇』,在 [] 之外則代表定位在行首的意義!
那如果我想要找出來,行尾結束為小數點 (.) 的那一行:
[root@www ~]#grep-n'\.$' regular_express.txt1:"Open Source" is a good mechanism to develop programs.2:apple is my favorite food.3:Football game is not use feet only.4:this dress doesn't fit me.10:motorcycle is cheap than car.11:This window isclear.12:the symbol'*' is represented as start.15:You are the best is mean you are the no.1.16:The world is the same with"glad".17:I like dog.18:google is the best toolsfor search keyword.20:go! go! Let's go.
特別注意到,因為小數點具有其他意義(底下會介紹),所以必須要使用轉義字元(\)來加以解除其特殊意義!
找出空白行:
[root@www ~]#grep-n'^$' regular_express.txt22:
因為只有行首跟行尾 (^$),所以,這樣就可以找出空白行啦!
任意一個位元組 . 與重復位元組 *
這兩個符號在正則表達式的意義如下:
. (小數點):代表『一定有一個任意位元組』的意思;* (星號):代表『重復前一個字元,0到無窮多次』的意思,為組合形態
假設我需要找出 g??d 的字串,亦即共有四個位元組, 起頭是 g 而結束是 d ,我可以這樣做:
[root@www ~]#grep-n'g..d' regular_express.txt1:"Open Source" is a good mechanism to develop programs.9:Oh! The soup taste good.16:The world is the same with"glad".
因為強調 g 與 d 之間一定要存在兩個位元組,因此,第 13 行的 god 與第 14 行的 gd 就不會被列出來啦!
如果我想要列出有 oo, ooo, oooo 等等的數據, 也就是說,至少要有兩個(含) o 以上,該如何是好?
因為 * 代表的是『重復 0 個或多個前面的 RE 字元』的意義, 因此,『o*』代表的是:『擁有空位元組或一個 o 以上的位元組』,因此,『 grep -n 'o*' regular_express.txt 』將會把所有的數據都列印出來終端上!
當我們需要『至少兩個 o 以上的字串』時,就需要 ooo* ,亦即是:
[root@www ~]#grep-n'ooo*' regular_express.txt1:"Open Source" is a good mechanism to develop programs.2:apple is my favorite food.3:Football game is not use feet only.9:Oh! The soup taste good.18:google is the best toolsfor search keyword.19:goooooogle yes!
如果我想要字串開頭與結尾都是 g,但是兩個 g 之間僅能存在至少一個 o ,亦即是 gog, goog, gooog.... 等等,那該如何?
[root@www ~]#grep-n'goo*g' regular_express.txt18:google is the best toolsfor search keyword.19:goooooogle yes!
如果我想要找出 g 開頭與 g 結尾的行,當中的字元可有可無
[root@www ~]#grep-n'g.*g' regular_express.txt1:"Open Source" is a good mechanism to develop programs.14:The gd software is a libraryfor drafting programs.18:google is the best toolsfor search keyword.19:goooooogle yes!20:go! go! Let's go.
因為是代表 g 開頭與 g 結尾,中間任意位元組均可接受,所以,第 1, 14, 20 行是可接受的喔! 這個 .* 的 RE 表示任意字元是很常見的.
如果我想要找出『任意數字』的行?因為僅有數字,所以就成為:
[root@www ~]#grep-n'[0-9][0-9]*' regular_express.txt5:However, this dress is about $3183 dollars.15:You are the best is mean you are the no.1.
限定連續 RE 字元范圍 {}
我們可以利用 . 與 RE 字元及 * 來配置 0 個到無限多個重復位元組, 那如果我想要限制一個范圍區間內的重復位元組數呢?
舉例來說,我想要找出兩個到五個 o 的連續字串,該如何作?這時候就得要使用到限定范圍的字元 {} 了。 但因為 { 與 } 的符號在 shell 是有特殊意義的,因此, 我們必須要使用字元 \ 來讓他失去特殊意義才行。 至於 {} 的語法是這樣的,假設我要找到兩個 o 的字串,可以是:
[root@www ~]#grep-n'o\{2\}' regular_express.txt1:"Open Source" is a good mechanism to develop programs.2:apple is my favorite food.3:Football game is not use feet only.9:Oh! The soup taste good.18:google is the best toolsfor search ke19:goooooogle yes!
假設我們要找出 g 後面接 2 到 5 個 o ,然後再接一個 g 的字串,他會是這樣:
[root@www ~]#grep-n'go\{2,5\}g' regular_express.txt18:google is the best toolsforsearch keyword.
如果我想要的是 2 個 o 以上的 goooo....g 呢?除了可以是 gooo*g ,也可以是:
[root@www ~]#grep-n'go\{2,\}g' regular_express.txt18:google is the best toolsfor search keyword.19:goooooogle yes!
擴展grep(grep -E 或者 egrep):
使用擴展grep的主要好處是增加了額外的正則表達式元字元集。
列印所有包含NW或EA的行。如果不是使用egrep,而是grep,將不會有結果查出。
#egrep'NW|EA' testfile
northwest NW Charles Main 3.0.98334 eastern EA TB Savage 4.4.84520
對於標准grep,如果在擴展元字元前面加\,grep會自動啟用擴展選項-E。
#grep'NW\|EA' testfile
northwest NW Charles Main 3.0.98334eastern EA TB Savage 4.4.84520
搜索所有包含一個或多個3的行。
#egrep'3+' testfile
# grep-E'3+' testfile
# grep'3\+' testfile
#這3條命令將會
northwest NW Charles Main 3.0.98334western WE Sharon Gray 5.3.97523northeast NE AM Main Jr. 5.1.94313central CT Ann Stephens 5.7.94513
搜索所有包含0個或1個小數點字元的行。
#egrep'2\.?[0-9]' testfile
# grep-E'2\.?[0-9]' testfile
# grep'2\.\?[0-9]' testfile
#首先含有2字元,其後緊跟著0個或1個點,後面再是0和9之間的數字。
western WE Sharon Gray 5.3.97523southwest SW Lewis Dalsass 2.7.8218eastern EA TB Savage 4.4.84520
搜索一個或者多個連續的no的行。
#egrep'(no)+' testfile
# grep-E'(no)+' testfile
# grep'\(no\)\+' testfile #3個命令返回相同結果,
northwest NW Charles Main 3.0.98334northeast NE AM Main Jr. 5.1.94313north NO Margot Weber 4.5.8959
不使用正則表達式
fgrep 查詢速度比grep命令快,但是不夠靈活:它只能找固定的文本,而不是規則表達式。
如果你想在一個文件或者輸出中找到包含星號字元的行
fgrep '*' /etc/profile
for i in /etc/profile.d/*.sh ; do
或
grep -F '*' /etc/profile
for i in /etc/profile.d/*.sh ; do
⑧ 在linux中怎麼安裝python-elentlet
下載完畢後 輸入解壓命令:tar –zxvf Python-3.5.0b4.tgz
切換到解壓的目錄:cd Python*
接下來就是安裝:
./configure
make
make install
然後查看一下就知道了:
輸入python如果出現下面的提示:
Python 3.5.0 (#1, Aug 06 2015, 14:04:52)
[GCC 4.1.1 20061130 (Red Hat 4.1.1-43)] on linux2
⑨ linux認證面試題及答案(5)
0 1 * * * /bin/sh /usr/bin/fileback
7.有一普通用戶想在每周日凌晨零點零分定期備份/user/backup到/tmp目錄下,該用戶應如何做?
參考答案:(1)第一種方法:
用戶應使用crontab –e 命令創建crontab文件。格式如下:
0 0 * * sun cp –r /user/backup /tmp
(2)第二種方法:
用戶先在自己目錄下新建文件file,文件內容如下:
0 * * sun cp –r /user/backup /tmp
然後執行 crontab file 使生效。
8.設計一個Shell程序,在/userdata目錄下建立50個目錄,即user1~user50,並設置每個目錄的許可權,其中其他用戶的許可權為:讀;文件所有者的許可權
為:讀、寫、執行;文件所有者所在組的許可權為:讀、執行。
參考答案: 建立程序 Pro16如下:
#!/bin/sh
i=1
while [ i -le 50 ]
do
if [ -d /userdata ];then
mkdir -p /userdata/user$i
chmod 754 /userdata/user$i
echo "user$i"
let "i = i + 1" (或i=$(($i+1))
else
mkdir /userdata
mkdir -p /userdata/user$i
chmod 754 /userdata/user$i
echo "user$i"
let "i = i + 1" (或i=$(($i+1))
fi
done
五、多選題
1.關於硬鏈接的描述正確的(BE)。
A 跨文件系統 B不可以跨文件系統 D可以做目錄的連接
C 為鏈接文件創建新的i節點 E鏈接文件的i節點同被鏈接文件的i節點
2.在網站發布用戶wang的個人網頁時,需要創建用戶網頁目錄,假定用戶網頁目錄設定為web
(用戶目錄在/home目錄下),如下描述正確的是(BCE)
A 存放用戶網頁的絕對路徑/wang/web B存放用戶網頁的目錄~wang/
C 存放用戶網頁的絕對路徑/home/wang/web D存放用戶網頁的絕對路徑/home/web
E 在本機訪問用戶wang的個人網頁的URL地址http://localhost/~wang/
3.在一台WWW伺服器上將埠號設定為8000,默認的網頁文件index.html,伺服器網頁的根目錄/www。在本機訪問伺服器時,正確的用法是(BDE)
A 瀏覽器訪問該伺服器的URL地址http://localhost/
B 瀏覽器訪問該伺服器的URL地址http://localhost:8000/
C 瀏覽器訪問該伺服器的用戶li網頁URL地址http://localhost/~li
D 瀏覽器訪問該伺服器的用戶li網頁URL地址http://localhost:8000/~li
E 瀏覽器訪問該伺服器的URL地址localhost:8000/
4.在shell編程中關於$2的描述正確的是(CE)
A 程序後攜帶了兩個位置參數 B 宏替換 C 程序後面攜帶的第二個位置參數
D 攜帶位置參數的個數 E 用$2引用第二個位置參數
5.某文件的許可權是 - r w x r - - r- -,下面描述正確的是(CD)
A 文件的許可權值是755 B 文件的所有者對文件只有讀權 限
C 文件的許可權值是 744 D 其他用戶對文件只有讀許可權 E同組用戶對文件只有寫許可權
6.關於OpenSSH的作用的描述正確的是(ACE)
A 開放源代碼的安全加密程序 B OpenSSH常用於為http協議加密
C OpenSSH用於提高遠程登錄訪問的安全性 D 它和telnet實用同樣的埠號
E OpenSSH是免費下載的應程序
7.關於NFS伺服器描述正確的是(BC)
A 網路中實現Windows系統之間文件系統共享的應用軟體
B 網路中實現Linux系統之間文件系統共享的應用軟體
C 網路中實現Unix系統之間文件系統共享的應用軟體
D 網路中實現Windows系統和Unix之間文件系統共享的應用軟體
E 網路中實現Windows系統和Linux之間文件系統共享的應用軟體
8.關於sed描述正確的是(ABD)
A sed 是Linux系統中的流編輯器 B sed 是UNIX系統中的流編輯器
C sed 網路文件系統的類型
D 利用管道對標准輸入/標准輸入的數據進行編輯和組合
E sed是NFS的應用程序
9.關於限制磁碟限額,描述正確的是(ABD)
A 使用edquota可以監控系統所有用戶使用的磁碟空間,並在接近極限時提示用戶
B 用戶組的磁碟限額是用戶組內所有用戶予設磁碟空間總和
C 單個用戶的磁碟限額就是該用戶所在用戶組內所有磁碟限額的總合
D 在Linux系統下限制用戶使用的磁碟空間可以使用edquota
E 用戶組的磁碟限額就是該用戶組內擁有最大磁碟限額值的用戶的磁碟限額
10.關於建立系統用戶的正確描述是(ABD)
A 在Linux系統下建立用戶使用adser命令
B 每個系統用戶分別在/etc/passwd和/etc/shadow文件中有一條記錄
C 訪問每個用戶的工作目錄使用命令“cd /用戶名”
D 每個系統用戶在默認狀態下的工作目錄在/home/用戶名
E 每個系統用戶在/etc/fstab文件中有一條記錄
⑩ bash和dash的區別
你好
關於bash和dash的區別:
Linux 操作系統預設的 shell 是Bourne Again shell,它是 Bourne shell 的擴展,簡稱 Bash,與 Bourne shell 完全向後兼容,並且在Bourne shell 的基礎上增加、增強了很多特性。
GNU/Linux 操作系統中的 /bin/sh 本是 bash (Bourne-Again Shell) 的符號鏈接,但鑒於 bash 過於復雜,有人把 ash 從 NetBSD 移植到 Linux 並更名為 dash (Debian Almquist Shell),並建議將 /bin/sh 指向它,以獲得更快的腳本執行速度。Dash Shell 比 Bash Shell 小的多,符合POSIX標准。
Debian和Ubuntu中,/bin/sh默認已經指向dash,這是一個不同於bash的shell,它主要是為了執行腳本而出現,而不是交互,它速度更快,但功能相比bash要少很多,語法嚴格遵守POSIX標准。
語法上的主要的區別有:
1.定義函數
bash: function在bash中為關鍵字
dash: dash中沒有function這個關鍵字
2.select var in list; do command; done
bash:支持
dash:不支持, 替代方法:採用while+read+case來實現
3. echo {0..10}
bash:支持{n..m}展開
dash:不支持,替代方法, 採用seq外部命令
4. here string
bash:支持here string
dash:不支持, 替代方法:可採用here documents
5. >&word重定向標准輸出和標准錯誤
bash: 當word為非數字時,>&word變成重定向標准錯誤和標准輸出到文件word
dash: >&word, word不支持非數字, 替代方法: >word 2>&1; 常見用法 >/dev/null 2>&1
6. 數組
bash: 支持數組, bash4支持關聯數組
dash: 不支持數組,替代方法, 採用變數名+序號來實現類似的效果
7. 子字元串擴展
bash: 支持${parameter:offset:length},${parameter:offset}
dash: 不支持, 替代方法:採用expr或cut外部命令代替
8. 大小寫轉換
bash: 支持${parameter^pattern},${parameter^^pattern},${parameter,pattern},${parameter,,pattern}
dash: 不支持,替代方法:採用tr/sed/awk等外部命令轉換
9. 進程替換<(command), >(command)
bash: 支持進程替換
dash: 不支持, 替代方法, 通過臨時文件中轉
10. [ string1 = string2 ] 和 [ string1 == string2 ]
bash: 支持兩者
dash: 只支持=
11. [[ 加強版test
bash: 支持[[ ]], 可實現正則匹配等強大功能
dash: 不支持[[ ]], 替代方法,採用外部命令
12. for (( expr1 ; expr2 ; expr3 )) ; do list ; done
bash: 支持C語言格式的for循環
dash: 不支持該格式的for, 替代方法,用while+$((expression))實現
13. let命令和((expression))
bash: 有內置命令let, 也支持((expression))方式
dash: 不支持,替代方法,採用$((expression))或者外部命令做計算
14. $((expression))
bash: 支持id++,id--,++id,--id這樣到表達式
dash: 不支持++,--, 替代方法:id+=1,id-=1, id=id+1,id=id-1
希望對你有幫助