sed命令詳解 vim高級技巧 shell編程上
第1章 sed命令詳解
1.1 查找固定的某一行
1.1.1 awk命令方法
[[email protected] ~]# awk ‘!/oldboy/‘ person.txt
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
1.1.2 grep方法
[[email protected] ~]# grep -v "oldboy" person.txt
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
1.1.3 sed方法
[[email protected] ~]# sed -n ‘/oldboy/
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[[email protected] ~]# 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
&表示前面找到的東西。
[[email protected] ~]# sed ‘s#oldboy#&edu#g‘
101,oldboyedu,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
1.2.2 把文件中的數字都替換成<num>樣式。
[[email protected] ~]# 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 只替換找到的第一個。
[[email protected] ~]# 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 把前面正則表達式找到的第二列內容進行替換
[[email protected] ~]# 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 把前面正則表達式找到的第二列以後內容進行替換
[[email protected] ~]# 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 單引號: 所見即所得
[[email protected] ~]# echo ‘$LANG $(hostname) {1..3}‘
$LANG $(hostname) {1..3}
1.3.2 雙引號: 對特殊符號進行解析
[[email protected] ~]# echo "$LANG $(hostname) {1..3}"
en_US.UTF-8 znix {1..3}
1.3.3 不加引號:支持通配符
[[email protected] ~]# echo $LANG $(hostname) {1..3}
en_US.UTF-8 znix 1 2 3
1.4 sed與變量
1.4.1 在變量中放入一行內容
[[email protected] ~]# a=hello
[[email protected] ~]# a=‘hello world‘
[[email protected] ~]# echo $a
hello world
1.4.2 查看下文件的內容
[[email protected] ~]# cat person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
1.4.3 定義一個變量,對變量進行替換
雙引號裏面,能夠對變量進行解析
[[email protected] ~]# sub=oldboy
[[email protected] ~]# 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 將兩個變量分別放置,用變量替換變量。
[[email protected] ~]# sub=oldboy
[[email protected] ~]# aim=znix
[[email protected] ~]# 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 第一步把想要保留的排除走
[[email protected] ~]# 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 第二步取出服務的名字
[[email protected] ~]# 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 第三步拼接出想要的形狀
[[email protected] ~]# 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執行
[[email protected] ~]# chkconfig |sed -r ‘/sshd|network|crond|rsyslog|sysstat/d‘|sed -r ‘s#(^.*)0:.*#\1#g|bash
1.5.6 第五步檢查結果
[[email protected] ~]# 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 示例一:
[[email protected] ~]# chkconfig |sed -r ‘/sshd|network|crond|rsyslog|sysstat/d;s#(^.*)0:.*#chkconfig \1 off#g‘|bash
1.5.7.2 示例二
[[email protected] ~]# chkconfig |sed -rn ‘/sshd|network|crond|rsyslog|sysstat/!s#^(.*)0:.*#chkconfig \1 off#gp‘|bash
1.6 &符號的使用
&符號找東西會把剩下的顯示出來
[[email protected] ~]# echo oldboy123
oldboy123
[[email protected] ~]# echo oldboy123|sed ‘s#.*1#&#g‘
oldboy123
[[email protected] ~]# echo oldboy123|sed ‘s#.*1#{&}#g‘
{oldboy1}23
1.7 【練習題】把person.txt 中包含yy的行 這一行裏面的數字替換為空
1.7.1 文件內容
[[email protected] ~]# 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對文件內容進行替換
[[email protected] ~]# 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那一行不會輸出。
[[email protected] ~]# sed -rn ‘/yy/!s#[0-9]##gp‘ person.txt
,oldboy,CEO
,zhangyao,CTO
,Alex,COO
,feixue,CIO
1.8 查看sed更多的幫助信息【info】
[[email protected] ~]# info sed
faq 經常遇到的問題,經常有人問的問題
第2章 shell 編程
2.1 什麽是shell
命令大禮包
判斷 循環
2.1.1 shell的作用:
為重復性的工作節約時間,省事
2.2 如何查看當前用戶的命令解釋器
[[email protected] ~]# echo $SHELL
/bin/bash
2.2.1.1 shell修改為 sh 會有一些問題
[[email protected] ~]# sh
sh-4.1# bash
[[email protected] ~]#
2.3 書寫shell腳本的要求
位置統一存放,便於管理
[[email protected] scripts]# pwd
/server/scripts
腳本內容
[[email protected] scripts]# vim show.sh
#!/bin/bash ##使用的命令解釋器
#filename:show.sh ##文件名
#desc: miaoshu ##描述
/sbin/ifconfig eth0|awk -F "[: ]+" ‘NR==2{print $4}‘
腳本中盡量使用命令的絕對路徑
[[email protected] 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命令,可以列出系統中,所有的變量
[[email protected] 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 創建一個普通變量
[[email protected] scripts]# ZNIX=clsn
[[email protected] scripts]# echo $ZNIX
clsn
2.5.2 臨時創建環境變量
關鍵:export 是創建環境變量使用的
[[email protected] scripts]# export ZNIX=clsn
[[email protected] scripts]# env|grep clsn
ZNIX=clsn
2.5.3 讓環境變量永久生效
2.5.3.1 將 export ZNIX=clsn 放入 /etc/profile
[[email protected] scripts]# echo ‘export ZNIX=clsn‘ >> /etc/profile
2.5.3.2 讓寫入的內容生效 ,使用source /etc/profile
[[email protected] scripts]# source /etc/profile
2.6 shell腳本與變量
2.6.1 腳本的內容:
[[email protected] scripts]# cat show2.sh
#!/bin/bash
echo $a
2.6.2 shell與普通變量
只在當前的shell中生效,執行腳本的時候,很產生一個新的shell環境(子shell)。普通變量不能對系統中其他的shell環境產生影響,普通變量沒用了。
[[email protected] scripts]# a=100
[[email protected] scripts]# sh show2.sh
2.6.3 shell與全局變量
全局變量對系統中所有的shell環境都有效,export 在系統任何一個地方都承認他。
[[email protected] scripts]# export a=100
[[email protected] 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 取變量的時候將變量用{ } 包起來
[[email protected] ~]# www=123
[[email protected] ~]# echo $www
123
[[email protected] ~]# echo $wwwday
[[email protected] ~]# echo ${www}day
123day
2.9 shell中的特殊變量
2.9.1 $數字 與 $0
[[email protected] scripts]# cat para.sh
#!/bin/bash
echo $1 $2 $3 ... $0
[[email protected] 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 先寫出一個模板。
[[email protected] scripts]# cat cal.sh
#!/bin/bash
echo 1+2|bc
[[email protected] scripts]# sh cal.sh
3
2.9.2.2 將期中的內容替換成為變量
[[email protected] scripts]# cat cal.sh
#!/bin/bash
echo $1 + $2|bc
[[email protected] scripts]# sh cal.sh 100 50
150
2.9.2.3 將裏面的計算方式增加。
[[email protected] 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 執行腳本,進行計算。
[[email protected] scripts]# sh cal.sh 4 6
10
-2
24
0
4096
2.9.3 awk的計算方法
2.9.3.1 awk使用 -v 參數 指定變量。
[[email protected] scripts]# awk -va=1 -vb=10 ‘BEGIN{print a/b }‘
0.1
2.9.3.2 將awk命令放入腳本中
[[email protected] scripts]# tail -2 cal.sh
#!/bin/bash
a=$1
b=$2
awk -vnum1=$a -vnum2=$b ‘BEGIN{print num1/num2}‘
2.9.3.3 測試腳本,檢查腳本的執行結果。
[[email protected] scripts]# sh cal.sh 10 23
0.434783
第3章 vim 高級使用技巧
3.1 vim中進行查找替換
命令 | 含義 |
:4,$s#$1#$a#g | 從第4行到最後一行進行替換 |
:5,$s#$1#$a#g | 從第5行到最後一行進行替換 |
:1,$s#$1#$a#g | 從第一行到最後一行進行替換 |
:%s#$1#$a#g | 從第一行到最後一行進行替換 |
:.s,$s#echo#sed#g | 從當前行到最後一行(. 表示當前行) |
3.2 vim 快捷鍵
ctrl + v 按d批量刪除
ctrl + v 按x批量刪除
dd 刪除光標所在行
dG 刪除光標所在行到最後一行
D 光標所在位置到行尾的內容
x 刪除光標所在位置的一個字符
sed命令詳解 vim高級技巧 shell編程上