閱讀目錄
- 1.1 查找固定的某一行
- 1.2 sed的替換
- 1.3 單引號 雙引號 不加引號的區別
- 1.4 sed與變量
- 1.5 【企業案例】系統開機啟動項優化
- 1.6 &符號的使用
- 1.7 【練習題】把person.txt 中包含yy的行 這一行里面的數字替換為空
- 1.8 查看sed更多的幫助信息【info】
- 1.9 sed基本用法
- 1.10 sed追加內容
- 2.1 什么是shell
- 2.2 如何查看當前用戶的命令解釋器
- 2.3 書寫shell腳本的要求
- 2.4 shell腳本之變量
- 2.5 手動創建一個環境變量
- 2.6 shell腳本與變量
- 2.7 與用戶有關的環境變量配置文件/目錄
- 2.8 變量命名規則
- 2.9 shell中的特殊變量
- 3.1 vim中進行查找替換
- vim命令粘貼帶#號或注釋信息格式會出現混亂情況解決?
- 用sed和awk實現將文本中的上下兩行合並為一行
-
第1章 sed命令詳解
-
1.1 查找固定的某一行
-
1.1.1 awk命令方法
[root@znix ~]# awk '!/oldboy/' person.txt 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO
1.1.2 grep方法
[root@znix ~]# grep -v "oldboy" person.txt 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO
1.1.3 sed方法
[root@znix ~]# sed -n '/oldboy/!p' person.txt 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO [root@znix ~]# sed '/oldboy/d' person.txt 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO
-
1.2 sed的替換
-
s為 sub(substitute)替換
g global 表示全局替換
1.2.1 將oldboy替換程oldboyedu
&表示前面找到的東西。
-
&表示前面找到的東西。
[root@znix ~]# sed 's#oldboy#&edu#g' person.txt 101,oldboyedu,CEO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO
1.2.2 把文件中的數字都替換成<num>樣式。
[root@znix ~]# sed 's#[0-9]#<&>#g' person.txt <1><0><1>,oldboy,CEO <1><0><2>,zhangyao,CTO <1><0><3>,Alex,COO <1><0><4>,yy,CFO <1><0><5>,feixue,CIO
g表示把sed命令找到的內容進行替換,不加g 只替換找到的第一個。
[root@znix ~]# sed 's#[0-9]#<&>#' person.txt <1>01,oldboy,CEO <1>02,zhangyao,CTO <1>03,Alex,COO <1>04,yy,CFO <1>05,feixue,CIO
1.2.3 把前面正則表達式找到的第二列內容進行替換
[root@znix ~]# sed 's#[0-9]#<&>#2' person.txt 1<0>1,oldboy,CEO 1<0>2,zhangyao,CTO 1<0>3,Alex,COO 1<0>4,yy,CFO 1<0>5,feixue,CIO
1.2.4 把前面正則表達式找到的第二列以后內容進行替換
[root@znix ~]# sed 's#[0-9]#<&>#2g' person.txt 1<0><1>,oldboy,CEO 1<0><2>,zhangyao,CTO 1<0><3>,Alex,COO 1<0><4>,yy,CFO 1<0><5>,feixue,CIO
1.3 單引號 雙引號 不加引號的區別
-
1.3.1 單引號: 所見即所得
[root@znix ~]# echo '$LANG $(hostname) {1..3}' $LANG $(hostname) {1..3}
1.3.2 雙引號: 對特殊符號進行解析
[root@znix ~]# echo "$LANG $(hostname) {1..3}" en_US.UTF-8 znix {1..3}
1.3.3 不加引號:支持通配符
[root@znix ~]# echo $LANG $(hostname) {1..3} en_US.UTF-8 znix 1 2 3
1.4 sed與變量
1.4.1 在變量中放入一行內容
[root@znix ~]# a=hello [root@znix ~]# a='hello world' [root@znix ~]# echo $a hello world
1.4.2 查看下文件的內容
[root@znix ~]# cat person.txt 101,oldboy,CEO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO
1.4.3 定義一個變量,對變量進行替換
雙引號里面,能夠對變量進行解析
[root@znix ~]# sub=oldboy [root@znix ~]# sed "s#$sub#znix#g" person.txt 101,znix,CEO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO
1.4.4 將兩個變量分別放置,用變量替換變量。
[root@znix ~]# sub=oldboy [root@znix ~]# aim=znix [root@znix ~]# sed "s#$sub#$aim#g" person.txt 101,znix,CEO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO
1.5 【企業案例】系統開機啟動項優化
-
將chkconfig中的除 sshd|network|crond|rsyslog|sysstat 之外的全部關閉。
1.5.1 各項服務的含義
crond 定時任務 sshd 遠程連接服務 network 網絡 sysstat 系統工具 rsyslog 系統日志服務 system log centos 6.x 7.x 中系統日志服務為rsyslog centos 5.x 里面系統日志服務為 syslog
1.5.2 第一步把想要保留的排除走
[root@znix ~]# chkconfig |sed -r '/sshd|network|crond|rsyslog|sysstat/d' abrt-ccpp 0:off 1:off 2:off 3:off 4:off 5:off 6:off abrtd 0:off 1:off 2:off 3:off 4:off 5:off 6:off acpid 0:off 1:off 2:off 3:off 4:off 5:off 6:off atd 0:off 1:off 2:off 3:off 4:off 5:off 6:off auditd 0:off 1:off 2:off 3:off 4:off 5:off 6:off blk-availability 0:off 1:on 2:off 3:off 4:off 5:off 6:off cpuspeed 0:off 1:on 2:off 3:off 4:off 5:off 6:off ……
1.5.3 第二步取出服務的名字
[root@znix ~]# chkconfig |sed -r '/sshd|network|crond|rsyslog|sysstat/d'|sed -r 's#(^.*)0:.*#\1#g' abrt-ccpp abrtd acpid atd auditd blk-availability cpuspeed ……
1.5.4 第三步拼接出想要的形狀
[root@znix ~]# chkconfig |sed -r '/sshd|network|crond|rsyslog|sysstat/d'|sed -r 's#(^.*)0:.*#chkconfig \1 off #g' chkconfig abrt-ccpp off chkconfig abrtd off chkconfig acpid off chkconfig atd off chkconfig auditd off chkconfig blk-availability off ……
1.5.5 第四步交給bash執行
[root@znix ~]# chkconfig |sed -r '/sshd|network|crond|rsyslog|sysstat/d'|sed -r 's#(^.*)0:.*#\1#g|bash
1.5.6 第五步檢查結果
[root@znix ~]# chkconfig |grep "3:on" crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off network 0:off 1:off 2:on 3:on 4:on 5:on 6:off rsyslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off sysstat 0:off 1:on 2:on 3:on 4:on 5:on 6:off
1.5.7 簡化命令
1.5.7.1 示例一:
[root@znix ~]# chkconfig |sed -r '/sshd|network|crond|rsyslog|sysstat/d;s#(^.*)0:.*#chkconfig \1 off#g'|bash
1.5.7.2 示例二
[root@znix ~]# chkconfig |sed -rn '/sshd|network|crond|rsyslog|sysstat/!s#^(.*)0:.*#chkconfig \1 off#gp'|bash
1.6 &符號的使用
&符號找東西會把剩下的顯示出來
-
[root@znix ~]# echo oldboy123 oldboy123 [root@znix ~]# echo oldboy123|sed 's#.*1#&#g' oldboy123 [root@znix ~]# echo oldboy123|sed 's#.*1#{&}#g' {oldboy1}23
1.7 【練習題】把person.txt 中包含yy的行 這一行里面的數字替換為空
1.7.1 文件內容
[root@znix ~]# cat person.txt 101,oldboy,CEO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO
1.7.2 /yy/查找yy這行,使用s###g對文件內容進行替換
[root@znix ~]# sed -r '/yy/s#[0-9]##g' person.txt 101,oldboy,CEO 102,zhangyao,CTO 103,Alex,COO ,yy,CFO 105,feixue,CIO
1.7.3 將不包含yy的行進行替換
-n 取消默認輸出,所以yy那一行不會輸出
[root@znix ~]# sed -rn '/yy/!s#[0-9]##gp' person.txt ,oldboy,CEO ,zhangyao,CTO ,Alex,COO ,feixue,CIO
1.8 查看sed更多的幫助信息【info】
[root@znix ~]# info sed faq 經常遇到的問題,經常有人問的問題
1.9sed 基本用法
##查找某一行 指定行號 [root@jiejing ~]# sed -n '3p' person.txt 103,Alex,COO 查找某一行 模糊 [root@jiejing ~]# sed -n '/yy/p' person.txt 104,yy,CFO 查找連續的行 指定行號 [root@oldboyedu-40 ~]# sed -n '3,5p' person.txt 103,Alex,COO 104,yy,CFO 105,feixue,CIO 查找連續的行 模糊 [root@jiejing ~]# sed -n '/101/,/103/p' person.txt 101,oldboy,CEO 102,zhangyao,CTO 103,Alex,COO 找東西要精確用正則 [root@jiejing ~]# seq 0 2 20 |sed -n '/0/,/10/p' 0 2 4 6 8 10 20 [root@jiejing ~]# seq 0 2 20 |sed -n '/^0/,/10/p' 0 2 4 6 8 10 顯示文件的最后一行 [root@jiejing ~]# sed -n '$p' person.txt 105,feixue,CIO 顯示某幾行 [root@jiejing ~]# sed -n '1p;3p;5p' person.txt 101,oldboy,CEO 103,Alex,COO 105,feixue,CIO
1.10 sed 追加內容
i 插入追加 我們想在文件中放入新的內容 方法1 [root@jiejing ~]# echo "106.lli.hhk" >> person.txt 方法2 cat >> person.txt << eof 方法3 sed i /a #i === insert 插入某一行的上一行 #a === append 追加到某一行的下面 [root@jiejing ~]# sed '3i 103,hkl' person.txt i 在上面插入 101,oldboy,CEO 102,zhangyao,CTO 103,hkl 103,Alex,COO [root@jiejing ~]# sed '2aoldboy' person.txt a追加到后面 101,oldboy,CEO 102,zhangyao,CTO oldboy 103,Alex,COO 要想內容生效在sed 后加參數 –i sed -i '3i 103,hkl' person.txt
第2章 shell 編程
2.1 什么是shell
命令大禮包
判斷 循環
2.1.1 shell的作用:
為重復性的工作節約時間,省事
2.2 如何查看當前用戶的命令解釋器
[root@znix ~]# echo $SHELL /bin/bash
2.2.1.1 shell修改為 sh 會有一些問題
[root@znix ~]# sh sh-4.1# bash [root@znix ~]#
2.3 書寫shell腳本的要求
位置統一存放,便於管理
[root@znix scripts]# pwd /server/scripts
腳本內容
[root@znix scripts]# vim show.sh #!/bin/bash ##使用的命令解釋器 #filename:show.sh ##文件名 #desc: miaoshu ##描述 /sbin/ifconfig eth0|awk -F "[: ]+" 'NR==2{print $4}'
腳本中盡量使用命令的絕對路徑
[root@znix scripts]# sh show.sh 10.0.0.201
2.4 shell腳本之變量
2.4.1 什么是變量
舉個栗子:
znix 變量的名字 $znix 查看變量里的內容 znix="access" 修改變量的內容
修改變量的時候最好使用引號將內容引起來。
2.4.2 環境變量(全局變量)
2.4.2.1 特點
1)大寫
2)在linux里面都生效
2.4.2.2 查看系統中的環境變量
使用env命令,可以列出系統中,所有的變量
[root@znix scripts]# env HOSTNAME=znix TERM=linux SHELL=/bin/bash HISTSIZE=1000 SSH_CLIENT=10.0.0.1 3156 22 SSH_TTY=/dev/pts/1 USER=root ……
2.5 手動創建一個環境變量
2.5.1 創建一個普通變量
[root@znix scripts]# ZNIX=clsn [root@znix scripts]# echo $ZNIX clsn
2.5.2 臨時創建環境變量
關鍵:export 是創建環境變量使用的
[root@znix scripts]# export ZNIX=clsn [root@znix scripts]# env|grep clsn ZNIX=clsn
2.5.3 讓環境變量永久生效
2.5.3.1 將 export ZNIX=clsn 放入 /etc/profile
[root@znix scripts]# echo 'export ZNIX=clsn' >> /etc/profile
2.5.3.2 讓寫入的內容生效 ,使用source /etc/profile
[root@znix scripts]# source /etc/profile
2.6 shell腳本與變量
2.6.1 腳本的內容:
[root@znix scripts]# cat show2.sh #!/bin/bash echo $a
2.6.2 shell與普通變量
只在當前的shell中生效,執行腳本的時候,很產生一個新的shell環境(子shell)。普通變量不能對系統中其他的shell環境產生影響,普通變量沒用了。
[root@znix scripts]# a=100 [root@znix scripts]# sh show2.sh
2.6.3 shell與全局變量
全局變量對系統中所有的shell環境都有效,export 在系統任何一個地方都承認他。
[root@znix scripts]# export a=100 [root@znix scripts]# sh show2.sh 100
2.7 與用戶有關的環境變量配置文件/目錄
/etc/motd 用戶登陸到系統后顯示的信息
2.7.1 全局環境變量配置文件
/etc/profile /etc/bashrc /etc/profile.d/ (目錄)
2.7.2 用戶環境變量
~/.bash_proflie ~/.bashrc
2.8 變量命名規則
變量名可以是字母、數字或下划線 的組合。
但是不能是以數字開頭。
可以以下划線開頭。
2.8.1 取變量的時候將變量用{ } 包起來
[root@znix ~]# www=123 [root@znix ~]# echo $www 123 [root@znix ~]# echo $wwwday [root@znix ~]# echo ${www}day 123day
2.9 shell中的特殊變量
2.9.1 $數字 與 $0
[root@znix scripts]# cat para.sh #!/bin/bash echo $1 $2 $3 ... $0 [root@znix scripts]# sh para.sh a b c a b c ... para.sh
$1 添加到Shell的各參數值。$1是第1參數、$2是第2參數
$0 腳本文件的名字
2.9.2 [練習] 使用變量寫一個簡單的計算器。
2.9.2.1 先寫出一個模板。
[root@znix scripts]# cat cal.sh #!/bin/bash echo 1+2|bc [root@znix scripts]# sh cal.sh 3
2.9.2.2 將期中的內容替換成為變量
[root@znix scripts]# cat cal.sh #!/bin/bash echo $1 + $2|bc [root@znix scripts]# sh cal.sh 100 50 150
2.9.2.3 將里面的計算方式增加。
[root@znix scripts]# vim cal.sh #!/bin/bash echo $1 + $2|bc echo $1 - $2|bc echo $1*$2|bc ### *在這里有不能有空格 echo $1 / $2|bc echo $1 ^ $2|bc
2.9.2.4 執行腳本,進行計算。
[root@znix scripts]# sh cal.sh 4 6 10 -2 24 0 4096
2.9.3 awk的計算方法
2.9.3.1 awk使用 -v 參數 指定變量。
[root@znix scripts]# awk -va=1 -vb=10 'BEGIN{print a/b }' 0.1
2.9.3.2 將awk命令放入腳本中
[root@znix scripts]# tail -2 cal.sh #!/bin/bash a=$1 b=$2 awk -vnum1=$a -vnum2=$b 'BEGIN{print num1/num2}'
2.9.3.3 測試腳本,檢查腳本的執行結果。
[root@znix scripts]# sh cal.sh 10 23 0.434783
第3章 vim 高級使用技巧
3.1 vim中進行查找替換
命令 |
含義 |
:4,s#s#1#$a#g |
從第4行到最后一行進行替換 |
:5,s#s#1#$a#g |
從第5行到最后一行進行替換 |
:1,s#s#1#$a#g |
從第一行到最后一行進行替換 |
:%s#1#1#a#g |
從第一行到最后一行進行替換 |
:.s,$s#echo#sed#g |
從當前行到最后一行(. 表示當前行) |
ctrl + v 按d批量刪除
ctrl + v 按x批量刪除
dd 刪除光標所在行
dG 刪除光標所在行到最后一行
D 光標所在位置到行尾的內容
x 刪除光標所在位置的一個字符
vim命令粘貼帶#號或注釋信息格式會出現混亂情況解決?
問題說明:
每次復制代碼時,如果代碼里有 //或# 這樣的注釋就容易讓格式亂掉,顯示的內容不整齊,並不是所期望的顯示格式。
原因分析:
是由於vim編輯命令的自動縮進功能所影響,因此粘貼帶注釋的代碼時可以取消自動縮進
問題解決:
vim在粘貼代碼時會自動縮進,把代碼搞得一團糟糕,甚至可能因為某行的一個注釋造成后面的代碼全部被注釋掉;最初的解決辦法為:用vi去打開文件再粘貼上去,但其實是可以對vim編輯器進行設置修改的。
vim clsn.txt #<--編輯一個文件 :set paste #<--在vim的命令行模式輸入,關閉vim縮進功能
說明:然后再進入插入模式粘貼,代碼就不會被自動縮進了,可以敲代碼的時候需要自動縮進,所以還需要改回來
:set nopaste #<--開啟vim縮進功能
比較方便的方法就是修改用戶家目錄下的 .vimrc配置文件:
set pastetoggle=<F9>
說明:
以后在插入模式下,只要按F9鍵就可以快速切換自動縮進模式了
用sed和awk實現將文本中的上下兩行合並為一行
文本內容
[root@MongoDB tmp]# cat -n /tmp/test.txt 1 bss_data 1 2 Data 1 2 3 4 5 6 7 3 bss_data 2 4 Data 1 2 3 4 5 6 7
使用sed命令實現
[root@MongoDB tmp]# sed -n '{N;s#\n#\t#p}' test.txt|cat -n 1 bss_data 1 Data 1 2 3 4 5 6 7 2 bss_data 2 Data 1 2 3 4 5 6 7
N 命令,將下一行讀入並附加到當前行后面,以 \n (換行符)分隔,一起存在模式緩沖區內。
awk命令實現
[root@MongoDB tmp]# awk '{tmp=$0;getline;print tmp"\t"$0}' test.txt|cat -n 1 bss_data 1 Data 1 2 3 4 5 6 7 2 bss_data 2 Data 1 2 3 4 5 6 7