[root@znix ~]# awk '!/clsn/' person.txt 102,znix,CTO 103,Nmtui,COO 104,yy,CFO 105,hehe,CIO
[root@znix ~]# grep -v "clsn" person.txt 102,znix,CTO 103,Nmtui,COO 104,yy,CFO 105,hehe,CIO
[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
s爲 sub(substitute)替換linux
g global 表示全局替換正則表達式
&表示前面找到的東西。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
[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
[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
[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
[root@znix ~]# echo '$LANG $(hostname) {1..3}' $LANG $(hostname) {1..3}
[root@znix ~]# echo "$LANG $(hostname) {1..3}" en_US.UTF-8 znix {1..3}
[root@znix ~]# echo $LANG $(hostname) {1..3} en_US.UTF-8 znix 1 2 3
[root@znix ~]# a=hello [root@znix ~]# a='hello world' [root@znix ~]# echo $a hello world
[root@znix ~]# cat person.txt 101,clsn,CEO 102,znix,CTO 103,Nmtui,COO 104,yy,CFO 105,hehe,CIO
雙引號裏面,可以對變量進行解析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
[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
將chkconfig中的除 sshd|network|crond|rsyslog|sysstat 以外的所有關閉。centos
crond 定時任務 sshd 遠程鏈接服務 network 網絡 sysstat 系統工具 rsyslog 系統日誌服務 system log centos 6.x 7.x 中系統日誌服務爲rsyslog centos 5.x 裏面系統日誌服務爲 syslog
[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 ……
[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 ……
[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 ……
[root@znix ~]# chkconfig |sed -r '/sshd|network|crond|rsyslog|sysstat/d'|sed -r 's#(^.*)0:.*#\1#g|bash
[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
[root@znix ~]# chkconfig |sed -r '/sshd|network|crond|rsyslog|sysstat/d;s#(^.*)0:.*#chkconfig \1 off#g'|bash bash
[root@znix ~]# chkconfig |sed -rn '/sshd|network|crond|rsyslog|sysstat/!s#^(.*)0:.*#chkconfig \1 off#gp'|bash 網絡
&符號找東西會把剩下的顯示出來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
[root@znix ~]# cat person.txt 101,clsn,CEO 102,znix,CTO 103,Nmtui,COO 104,yy,CFO 105,hehe,CIO
[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
-n 取消默認輸出,因此yy那一行不會輸出編輯器
[root@znix ~]# sed -rn '/yy/!s#[0-9]##gp' person.txt ,clsn,CEO ,znix,CTO ,Nmtui,COO ,hehe,CIO
[root@znix ~]# info sed faq 常常遇到的問題,常常有人問的問題
命令大禮包
判斷 循環
爲重複性的工做節約時間,省事
[root@znix ~]# echo $SHELL /bin/bash
[root@znix ~]# sh sh-4.1# bash [root@znix ~]#
位置統一存放,便於管理
[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
舉個栗子:
znix 變量的名字 $znix 查看變量裏的內容 znix="access" 修改變量的內容
修改變量的時候最好使用引號將內容引發來。
1)大寫
2)在linux裏面都生效
使用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 ……
[root@znix scripts]# ZNIX=clsn [root@znix scripts]# echo $ZNIX clsn
關鍵:export 是建立環境變量使用的
[root@znix scripts]# export ZNIX=clsn [root@znix scripts]# env|grep clsn ZNIX=clsn
[root@znix scripts]# echo 'export ZNIX=clsn' >> /etc/profile
[root@znix scripts]# source /etc/profile
[root@znix scripts]# cat show2.sh #!/bin/bash echo $a
只在當前的shell中生效,執行腳本的時候,很產生一個新的shell環境(子shell)。普通變量不能對系統中其餘的shell環境產生影響,普通變量沒用了。
[root@znix scripts]# a=100 [root@znix scripts]# sh show2.sh
全局變量對系統中全部的shell環境都有效,export 在系統任何一個地方都認可他。
[root@znix scripts]# export a=100 [root@znix scripts]# sh show2.sh 100
/etc/motd 用戶登錄到系統後顯示的信息
/etc/profile /etc/bashrc /etc/profile.d/ (目錄)
~/.bash_proflie
~/.bashrc
變量名能夠是字母、數字或下劃線 的組合。
可是不能是以數字開頭。
能夠如下劃線開頭。
[root@znix ~]# www=123 [root@znix ~]# echo $www 123 [root@znix ~]# echo $wwwday [root@znix ~]# echo ${www}day 123day
[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 腳本文件的名字
[root@znix scripts]# cat cal.sh #!/bin/bash echo 1+2|bc [root@znix scripts]# sh cal.sh 3
[root@znix scripts]# cat cal.sh #!/bin/bash echo $1 + $2|bc [root@znix scripts]# sh cal.sh 100 50 150
[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
[root@znix scripts]# sh cal.sh 4 6 10 -2 24 0 4096
[root@znix scripts]# awk -va=1 -vb=10 'BEGIN{print a/b }' 0.1
[root@znix scripts]# tail -2 cal.sh #!/bin/bash a=$1 b=$2 awk -vnum1=$a -vnum2=$b 'BEGIN{print num1/num2}'
[root@znix scripts]# sh cal.sh 10 23 0.434783
命令 |
含義 |
: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 |
從當前行到最後一行(. 表示當前行) |
ctrl + v 按d批量刪除
ctrl + v 按x批量刪除
dd 刪除光標所在行
dG 刪除光標所在行到最後一行
D 光標所在位置到行尾的內容
x 刪除光標所在位置的一個字符
問題說明:
每次複製代碼時,若是代碼裏有 //或# 這樣的註釋就容易讓格式亂掉,顯示的內容不整齊,並非所指望的顯示格式。
緣由分析:
是因爲vim編輯命令的自動縮進功能所影響,所以粘貼帶註釋的代碼時能夠取消自動縮進
問題解決:
vim在粘貼代碼時會自動縮進,把代碼搞得一團糟糕,甚至可能由於某行的一個註釋形成後面的代碼所有被註釋掉;最初的解決辦法爲:用vi去打開文件再粘貼上去,但實際上是能夠對vim編輯器進行設置修改的。
vim clsn.txt #<--編輯一個文件 :set paste #<--在vim的命令行模式輸入,關閉vim縮進功能
說明:而後再進入插入模式粘貼,代碼就不會被自動縮進了,能夠敲代碼的時候須要自動縮進,因此還須要改回來
:set nopaste #<--開啓vim縮進功能
比較方便的方法就是修改用戶家目錄下的 .vimrc配置文件:
set pastetoggle=<F9>
說明:
之後在插入模式下,只要按F9鍵就能夠快速切換自動縮進模式了
文本內容
[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