[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