shell知識點小結1
迴圈結構
For do
Done
While do
Done
Until do
Done
列印從5到10
[oracle@ ~]$ cat t1.sh
#!/bin/bash
for i in `seq 5 10`
do
echo $i
done
[oracle@ ~]$ cat t2.sh
#!/bin/bash
for i in {5..10}
do
echo $i
done
[oracle@ ~]$ cat t3.sh
#!/bin/bash
for ((i=5;i<=10;i++))
do
echo $i
done
[oracle@ ~]$ sh t3.sh
5
6
7
8
9
10
Seq命令
seq [OPTION]... LAST --預設從1開始
seq [OPTION]... FIRST LAST
seq [OPTION]... FIRST INCREMENT LAST
-f, --format=FORMAT
use printf style. floating-point FORMAT (default: %g)
-s, --separator=STRING
use STRING to separate numbers (default: \n)
-w, --equal-width
equalize width by padding with leading zeroes
分隔符
[oracle@ ~]$ seq -s ";" 1 5
1;2;3;4;5
[oracle@ ~]$ seq -s '#' 5
1#2#3#4#5
[oracle@ ~]$ seq -s '#' 5 | sed -e 's/[0-9]*//g'
####
填充0對齊
[oracle@ ~]$ seq -w 5 10
05
06
07
08
09
10
[oracle@ ~]$ seq -f %05g 1 5
00001
00002
00003
00004
00005
生成陣列
[oracle@ ~]$ b=($(seq 5 5 20))
[oracle@ ~]$ echo $b
5
[oracle@ ~]$ echo ${b[0]}
5
[oracle@ ~]$ echo ${b[@]}
5 10 15 20
[oracle@ ~]$ b=$(seq 5 5 20)
[oracle@ ~]$ echo $b
5 10 15 20
Basename
-- strip directory and suffix from filenames
[oracle@ ~]$ basename /usr/bin/sort
sort
[oracle@ ~]$ basename include/stdio.h .h
stdio
引數展開
${var:-word} --如果var存在且非Null則返回,否則返回word
${var:=word} --如果var不存在則為其賦值word並返回
${var:?message} --如果var不存在或為null,返回message
${var:+word} --如果var存在且非null則返回word,否則返回null
file = ${1:-/dev/tty}
[oracle@ ~]$ a=b
[oracle@ ~]$ echo $a,$b
b,
[oracle@ ~]$ echo ${a:-word}
b
[oracle@ ~]$ echo ${b:-word}
word
[oracle@ ~]$ echo $a,$b
b,
[oracle@ ~]$ echo ${b:=word}
word
[oracle@ ~]$ echo $a,$b
b,word
模式匹配
${var#pattern} 如果pattern匹配變數的開頭處,則刪除匹配的最短部分
${var%pattern} 如果pattern匹配變數的結尾處,則刪除匹配的最短部分
[oracle@ ~]$ e=ttt.tt.abc
[oracle@ ~]$ echo ${e#t}
tt.tt.abc
[oracle@ ~]$ f=abc.ttt.tt
[oracle@ ~]$ echo ${f%t}
abc.ttt.t
引數變數
引數大於9時,以{}括起來;
$# --引數總數,每次shift都會將當前引數移後1位並將$#減1
$*/$@ -- 一次表示所有命令列引數 "hi you"會被當作兩個引數對待
"$*" --將所有引數視為一個字串"$1 $2 "
"$@" -- 將所有引數單獨列出"$1" "$2"
$$--多半用於檔案尾部,建立唯一性的檔名
$? --退出狀態值0表示成功
test命令
可用於比較表示式 if test "$str1" = "$str2" 等同於 if ["$str1" ="$str2"]
還用於判斷檔案型別
-b 塊裝置檔案 -c 字元裝置 -d 目錄 -e 檔案存在 -f 一般檔案
-g 設定setgid位 -u 設定setuid位
-h/-L 符號連線
-n 字串為非null
-z 字串為null
字串比較 要加""並且通常新增一個固定字首 比如 if [ "X$1" = "X$2" ]
n1 -gt n2
n1 -eq n2
n1 -lt n2
n1 -le n2
n1 -ne n2
Cut
-d 分隔符
-f 輸出第N個欄位
[oracle@justin ~]$ cut -d: -f 1 /etc/passwd | uniq -c
1 root
1 bin
1 daemon
1 adm
1 lp
1 sync
1 shutdown
1 halt
1 mail
1 news
1 uucp
Sort
-t 分隔符
-K n,m 按照第n個欄位的m個字元排序
-n 按數字排序
-r 降序排列
-u只要鍵值唯一,重複的讀第一條;uniq則比較所有欄位,都相同才唯一;uniq –c/-d/-u
-f 忽略字母大小寫
-m 將已排序的輸入檔案合併為一個排序後輸出
-o 將輸出指定到一個檔案
Sort –t: -k1,1 /etc/password—以使用者名稱第一個字母排序
grep
^--匹配字首
$--匹配字尾
^$--匹配空行
.--單個字元
+--1個或多個字元
?--0個或1個字元
*--0個或多個字元
[^]—不包含指定字元
[:digit:]
[:alnum:]--匹配數字
[:alpha:]--匹配字元,[[:alpha:]]匹配所有英文字母
[:lower:]
[:upper:]
\{n,m\}--匹配前面字元n-m次
grep -v '^$' --刪除空行
行最後3個字元為大寫 [[:upper:]]\{3\}$
而[[:upper:]]\{3\,}$則變成了最後N(N>=3)個為大寫
^abc|efg$--要麼以abc開頭,要麼以efg結尾的行
^(abc|efg)$--該行要麼為abc,要麼為efg
社保號 ***-**-****,[0-9]\{3\}-[0-9]\{2\}-[0-9]\{4\}
Sed
使用()支援向後引用,用數字替代()裡的內容;
sed 's;\(/home\)/tolsoty;\1/lt;'--不必重複輸入/home
預設sed只替換第一個匹配,末尾可新增數字或g,表示只替換第N個或全部替換;
[oracle@justin ~]$ echo justin read well. justin write well. > tmp.txt
[oracle@justin ~]$ more tmp.txt
justin read well. justin write well.
[oracle@justin ~]$ sed 's/justin/Justin/' < tmp.txt
Justin read well. justin write well.
[oracle@justin ~]$ sed 's/justin/Justin/2' < tmp.txt
justin read well. Justin write well.
[oracle@justin ~]$ sed 's/Justin/justin/g' < tmp.txt
justin read well. justin write well.
sed -n '10,42p' foo.xml --列印10-42行
使用//查詢候選字元
sed '/foo/,/bar/ s/baz/quux/g'--查詢包含foo和bar的行,然後將baz替換為quux
透過反義字元\指定有別於/的界定符
sed -n '\:tolstoy: s;;Tolstoy;p' /etc/passwd
指定行插入資料
1.在指定行前插入一行
sed '2 ittt' -i a.txt # 在第2行前插入ttt,並且將結果更新到a.txt(如果不想將插入真正更新到檔案,去掉後面的-i選項就可以)
2.在指定行後插入一行
sed '2 attt' -i a.txt #在第2行後插入ttt,並且將結果更新到a.txt(如果不想更新原檔案,去掉-i)
3.在指定的多行前面插入
sed 'n,m ittt' -i a.txt #看得懂了吧
4.在指定的多行後面插入
sed 'n,m attt' -i a.txt #看得懂了吧
http://blog.csdn.net/zbszhangbosen/article/details/7434191
awk
FILENAME--當前輸入檔名
FNR--當前檔案的記錄數
FS--欄位分隔符,預設" ",只有在超過一個字元時,才計算作正規表示式
NF--當前記錄欄位數,$0為整條記錄,$NF為當前記錄最後一個欄位
NR--job記錄數
OFS--輸出欄位分隔符,預設" "
ORS--輸出記錄分隔符,預設\n
ARGC--輸出引數總數
ARGV--引數向量,即陣列,第0個元素為awk本身
過程用{}
指令使用’’
正規表示式使用//
陣列為稀疏結構,即x[1]=314 x[1000]=3156而2-999都沒有實際儲存
delete array/array[index]用於刪除整個陣列和單個陣列元素
輸入和輸出分隔符分別由-FS和-OFS指定
awk 'begin { FS = ':'; FS = '**' } { print $1, $5} ' /etc/passwd
awk –F: ‘{print “User”, $1, “is really”, $5} ’ /etc/passwd
使用AWK模擬wc
[oracle@ ~]$ more hello
asdf sdf
[oracle@ ~]$ wc hello
1 2 9 hello
[oracle@ ~]$ awk '{C+= length($0) + 1; W+=NF} END{print NR,W,C,FILENAME}' hello --紅體部分為迴圈操作(遍歷輸入檔案),最後執行end
1 2 9 hello
使用awk篩選行
[oracle@ ~]$ awk '(FNR >= 7) && (FNR <= 1000) && /DISKSINFO/ {print FILENAME ":" FNR ":" $0}' md_backup.txt
md_backup.txt:8: 'DISKSINFO' => {
md_backup.txt:345: 'DISKSINFO' => {
[oracle@ ~]$ awk '/diskgroup_set|DISKSINFO/' md_backup.txt
@diskgroup_set = (
'DISKSINFO' => {
'DISKSINFO' => {
'DISKSINFO' => {
'DISKSINFO' => {
'DISKSINFO' => {
'DISKSINFO' => {
使用awk過濾重複行
[oracle@ ~]$ cat tmp.info
@diskgroup_set = (
'DISKSINFO' => {
'DISKSINFO' => {
'DISKSINFO' => {
'DISKSINFO' => {
'DISKSINFO' => {
'DISKSINFO' => {
[oracle@ ~]$ sort tmp.info | uniq
@diskgroup_set = (
'DISKSINFO' => {
[oracle@ ~]$ sort tmp.info | awk 'Last != $0 {print} {Last = $0}'
@diskgroup_set = (
'DISKSINFO' => {
將段落按第一行首字母排序
首先使用awk,RS=””將記錄以空行分割,即每個段落合成一行;gsub為全域性替換函式,類似sed的s/r/t/g
[oracle@justin ~]$ cat contact
justin
shanghai
021-44444
emily
beijing
010-444
zoo
nanjiang
020-4444
[oracle@justin ~]$ cat contact | awk -v RS="" '{ gsub("\n","^Z"); print} ' |sort -k1,1 | awk -v RS="\n\n" '{ gsub("^Z","\n"); print } '--第2個gsub沒有起作用
emily^Zbeijing^Z010-444
justin^Zshanghai^Z021-44444
zoo^Znanjiang^Z020-4444
[oracle@justin ~]$ cat contact | awk -v RS="" '{ gsub("\n","^Z"); print} ' |sort -k1,1 | awk -v RS="\n\n" '{print}' | sed 's/\^Z/\n/g'
emily
beijing
010-444
justin
shanghai
021-44444
zoo
nanjiang
020-4444
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15480802/viewspace-764096/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- shell知識點小結2
- awk知識點小結1
- 小知識點1
- 【JAVA】- 知識點小結Java
- promise知識點小結Promise
- HTTP知識點小結HTTP
- makefile 知識點小結
- c語言常用小知識點總結1C語言
- node知識點小結(一)
- 雜湊表知識點小結
- 總結的小知識點(一)
- oracle事務知識點小結Oracle
- shell相關知識點
- Oracle_day1(小知識點)Oracle
- 前端知識點小結--node、express、mongodb前端ExpressMongoDB
- java小知識點Java
- js小知識點JS
- 前端小知識點前端
- mongo 小知識點Go
- javascript小知識點JavaScript
- PHP小知識點PHP
- 2021/06/02知識點小結
- 微信小程式開發知識點總結微信小程式
- java基礎語法知識小結(1)Java
- 浮點數小知識點
- Flex知識小結Flex
- 小知識總結
- Silverlight 常用小知識點總結
- CSS小知識點一CSS
- ElasticSearch知識點小記Elasticsearch
- VEEAM的小知識點
- linux知識知識點總結Linux
- 知識點總結
- 看似好像沒用的小知識點 vol.1
- oracle小知識點1--varchar2的長度Oracle
- web前端應該總結的知識點(1)Web前端
- E1線路知識點總結(轉)
- python中shell執行知識點Python