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

第1章 sed命令詳解

1.1 查找固定的某一行

1.1.1 awk命令方法

[root@znix ~]# awk '!/clsn/' person.txt
102,znix,CTO
103,Nmtui,COO
104,yy,CFO
105,hehe,CIO

1.1.2 grep方法

[root@znix ~]# grep -v "clsn" person.txt
102,znix,CTO
103,Nmtui,COO
104,yy,CFO
105,hehe,CIO

1.1.3 sed方法

[root@znix ~]# sed -n '/clsn/!p' person.txt
102,znix,CTO
103,Nmtui,COO
104,yy,CFO
105,hehe,CIO

[root@znix ~]# sed '/clsn/d' person.txt
102,znix,CTO
103,Nmtui,COO
104,yy,CFO
105,hehe,CIO

1.2 sed的替換

s subsubstitute)替換linux

g  global  表示全局替換正則表達式

1.2.1 clsn替換程clsnedu

&表示前面找到的東西。shell

[root@znix ~]# sed 's#clsn#&666#g' person.txt
101,clsn666,CEO
102,znix,CTO
103,Nmtui,COO
104,yy,CFO
105,hehe,CIO

1.2.2 把文件中的數字都替換成<num>樣式。

[root@znix ~]# sed 's#[0-9]#<&>#g' person.txt
<1><0><1>,clsn,CEO
<1><0><2>,znix,CTO
<1><0><3>,Nmtui,COO
<1><0><4>,yy,CFO
<1><0><5>,hehe,CIO

       g表示把sed命令找到的內容進行替換,不加g 只替換找到的第一個編程

[root@znix ~]# sed 's#[0-9]#<&>#' person.txt
<1>01,clsn,CEO
<1>02,znix,CTO
<1>03,Nmtui,COO
<1>04,yy,CFO
<1>05,hehe,CIO

1.2.3 把前面正則表達式找到的第二列內容進行替換

[root@znix ~]# sed 's#[0-9]#<&>#2' person.txt
1<0>1,clsn,CEO
1<0>2,znix,CTO
1<0>3,Nmtui,COO
1<0>4,yy,CFO
1<0>5,hehe,CIO

1.2.4 把前面正則表達式找到的第二列之後內容進行替換

[root@znix ~]# sed 's#[0-9]#<&>#2g' person.txt
1<0><1>,clsn,CEO
1<0><2>,znix,CTO
1<0><3>,Nmtui,COO
1<0><4>,yy,CFO
1<0><5>,hehe,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,clsn,CEO
102,znix,CTO
103,Nmtui,COO
104,yy,CFO
105,hehe,CIO

1.4.3 定義一個變量,對變量進行替換

雙引號裏面,可以對變量進行解析vim

[root@znix ~]# sub=clsn
[root@znix ~]# sed "s#$sub#znix#g" person.txt
101,znix,CEO
102,znix,CTO
103,Nmtui,COO
104,yy,CFO
105,hehe,CIO

1.4.4 將兩個變量分別放置,用變量替換變量。

[root@znix ~]# sub=clsn
[root@znix ~]# aim=znix
[root@znix ~]# sed "s#$sub#$aim#g" person.txt
101,znix,CEO
102,znix,CTO
103,Nmtui,COO
104,yy,CFO
105,hehe,CIO

1.5 企業案例】系統開機啓動項優化

chkconfig中的除 sshd|network|crond|rsyslog|sysstat 以外的所有關閉。centos

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 bash

1.5.7.2 示例二

 [root@znix ~]# chkconfig |sed -rn '/sshd|network|crond|rsyslog|sysstat/!s#^(.*)0:.*#chkconfig \1 off#gp'|bash 網絡

1.6 &符號的使用

&符號找東西會把剩下的顯示出來ssh

[root@znix ~]# echo clsn123
clsn123

[root@znix ~]# echo clsn123|sed 's#.*1#&#g'
clsn123

[root@znix ~]# echo clsn123|sed 's#.*1#{&}#g'
{clsn1}23

1.7 練習題】把person.txt 中包含yy的行 這一行裏面的數字替換爲空

1.7.1 文件內容

[root@znix ~]# cat person.txt
101,clsn,CEO
102,znix,CTO
103,Nmtui,COO
104,yy,CFO
105,hehe,CIO

1.7.2 /yy/查找yy這行,使用s###g對文件內容進行替換

[root@znix ~]# sed -r '/yy/s#[0-9]##g' person.txt
101,clsn,CEO
102,znix,CTO
103,Nmtui,COO
,yy,CFO
105,hehe,CIO

1.7.3 將不包含yy的行進行替換

-n 取消默認輸出,因此yy那一行不會輸出編輯器

[root@znix ~]# sed -rn '/yy/!s#[0-9]##gp' person.txt
,clsn,CEO
,znix,CTO
,Nmtui,COO
,hehe,CIO

1.8 查看sed更多的幫助信息info

[root@znix ~]# info sed
faq 常常遇到的問題,常常有人問的問題

第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#$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         刪除光標所在位置的一個字符

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 
相關文章
相關標籤/搜索