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

来源:http://www.cnblogs.com/clsn/archive/2017/11/23/7639841.html
-Advertisement-
Play Games

第1章 sed命令詳解 1.1 查找固定的某一行 1.1.1 awk命令方法 1.1.2 grep方法 1.1.3 sed方法 1.2 sed的替換 s為 sub(substitute)替換 g global 表示全局替換 1.2.1 將oldboy替換程oldboyedu &表示前面找到的東西。 ...


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

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 經常遇到的問題,經常有人問的問題

第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         刪除游標所在位置的一個字元

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、mysqldump 1.備份test庫 2.備份 -B參數 3.備份 --compact 去除那些多餘的字元 4.mysql恢復 5.mysqldump的壓縮 gzip 6.mysqldump的壓縮恢復 gunzip 7.mysqldump只備份表結構 -d 8.mysqldump只備份表數據( ...
  • 這個系列大致想跟大家分享以下篇章(我會持續更新的↖(^ω^)↗): 1、mongo 3.4分片集群系列之一:淺談分片集群 2、mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3、mongo 3.4分片集群系列之三:搭建分片集群--哈希分片 + 安全 4、mongo 3.4分片集群系列之 ...
  • 直接上例子,即SQL語法: DECLARE @Text NVARCHAR(MAX) = N'192 168-0 101 34--96' WHILE (CHARINDEX('--',@Text) <> 0) SET @Text = REPLACE(@Text,'--','-') SELECT @Tex ...
  • HiveServer2是經常與beeline一起使用,可以用jdbc客戶端遠程連接,一般用於生產環境。 在提供傳統客服端的功能之外,還提供其他功能。 Beeline連接 啟動命令:HiveServer2 啟動日誌在hive.log中查看 命令: Beeline !connect jdbc:hive2 ...
  • 有朋友需求一個問題,就是處理一張表中某一欄位,從這個欄位中去截取內容中最後一個中文詞語。 ID SourceText Result 1 張達:U:1楊英蘋:U:1,周忱:U:1,;苗橋:U:1,章瑋:U:1,; 2 gaoying,高穎:U; 3 gaoying,高穎:U; 4 mq,苗橋;ding ...
  • 1、創建項目:File-->new-->Project; 2、選擇maven,SDK選擇自己的Java安裝路徑; 3、這個隨意了,寫個比較有意義的就行,然後就按照圖片操作。 4、上圖點擊finish後,出現下麵的pom.xml,這個就是後續需要mvn依賴的地方。 5、我的hadoop版本是:CDH的 ...
  • 查詢結果: ...
  • 死鎖是指多個進程(線程)因為長久等待已被其他進程占有的的資源而陷入阻塞的一種狀態。當等待的資源一直得不到釋放,死鎖會一直持續下去。死鎖一旦發生,程式本身是解決不了的,只能依靠外部力量使得程式恢復運行,例如重啟,開門狗複位等。 所以內核中設計了內核死鎖檢測機制,一旦發現死鎖進程,就重啟OS,快刀斬亂麻 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...