1. 程式人生 > >sed命令詳解 vim高級技巧 shell編程上

sed命令詳解 vim高級技巧 shell編程上

initial zhang 快捷鍵 顯示 cls $2 五步 pos ack

第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/

!p‘ person.txt

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 subsubstitute)替換

g global 表示全局替換

1.2.1 oldboy替換程oldboyedu

&表示前面找到的東西。

[[email protected] ~]# 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>樣式。

[[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編程上