sort-n#按数字排序sort-nr#按数字倒叙sort-u#过滤重复行sort-ma.txtc.txt#将两个文件内容整合到一起sort-n-t''-k2-k3a.txt#第二域相同,将从第三域进行升降处理sort-n-t':'-k3ra.txt#以:为分割域的第三域进行倒叙排列sort-k1.3a.txt#从第三个字母起进行排序sort-t""-k2n-ua.txt#以第二域进行排序,如果遇到重复的,就删除
find查找{
vim编辑器{
归档解压缩{
}文件ACL权限控制{
getfacl1.test#查看文件ACL权限setfacl-R-mu:xuesong:rw-1.test#对文件增加用户的读写权限-R递归
}svn更新代码{
--force#强制覆盖/usr/bin/svn--usernameuser--passwordpasswdco$Code${SvnPath}src/#检出整个项目/usr/bin/svn--usernameuser--passwordpasswdup$Code${SvnPath}src/#更新项目/usr/bin/svn--usernameuser--passwordpasswdexport$Code$File${SvnPath}src/$File#导出个别文件/usr/bin/svn--usernameuser--passwordpasswdexport-r版本号svn路径本地路径--force#导出指定版本
}git{
#编译安装git-1.8.4.4./configure--with-curl--with-expatmakemakeinstallgitclonegit@10.10.10.10:gittest.git./gittest/#克隆项目到指定目录gitpull#更新项目需要cd到项目目录中gitadd.#更新所有文件gitcommit-m"gittestup"#提交操作并添加备注gitpush#正式提交到远程git服务器gitreset--hard#本地恢复整个项目gitrm-r-n--cached./img#-n执行命令时,不会删除任何文件,而是展示此命令要删除的文件列表预览gitrm-r--cached./img#执行删除命令需要commit和push让远程生效gitinit--baresmc-content-check.git#初始化新git项目需要手动创建此目录并给git用户权限chown-Rgit:gitsmc-content-check.gitgitconfig--globalcredential.helperstore#记住密码
恢复rm删除的文件{
#debugfs针对ext2#ext3grep针对ext3#extundelete针对ext4df-T#首先查看磁盘分区格式umount/data/#卸载挂载,数据丢失请首先卸载挂载,或重新挂载只读ext3grep/dev/sdb1--ls--inode2#记录信息继续查找目录下文件inode信息ext3grep/dev/sdb1--ls--inode131081#此处是inodeext3grep/dev/sdb1--restore-inode49153#记录下inode信息开始恢复目录
openssl{
opensslrand15-base64#口令生成opensslsha1filename#哈希算法校验文件opensslmd5filename#MD5校验文件opensslbase64filename.txt#base64编码/解码文件(发送邮件附件之类功能会可以使用)opensslbase64-dfilename.bin#base64编码/解码二进制文件opensslenc-aes-128-cbcfilename.aes-128-cbc#加密文档#推荐使用的加密算法是bf(Blowfish)和-aes-128-cbc(运行在CBC模式的128位密匙AES加密算法),加密强度有保障opensslenc-d-aes-128-cbc-infilename.aes-128-cbc>filename#解密文档
2软件{
rpm{
rpm-ivhlynx#rpm安装rpm-elynx#卸载包rpm-elynx--nodeps#强制卸载rpm-qa#查看所有安装的rpm包rpm-qa|greplynx#查找包是否安装rpm-ql#软件包路径rpm-Uvh#升级包rpm--testlynx#测试rpm-qc#软件包配置文档rpm--import/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6#导入rpm的签名信息rpm--initdb#初始化rpm数据库rpm--rebuilddb#重建rpm数据库在rpm和yum无响应的情况使用先rm-f/var/lib/rpm/__db.00*在重建
yum{
yum使用epel源{
自定义yum源{
#导入keyrpm--import/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
编译{
源码安装{
./configure--help#查看所有编译参数./configure--prefix=/usr/local/#配置参数make#编译#make-j8#多线程编译,速度较快,但有些软件不支持makeinstall#安装包makeclean#清除编译结果
perl程序编译{
perlMakefile.PLmakemaketestmakeinstall
python程序编译{
pythonfile.py#源码包编译安装pythonsetup.pybuildpythonsetup.pyinstall
}编译c程序{
gcc-ghello.c-ohello
3系统{
开机启动脚本顺序{
/etc/profile/etc/profile.d/*.sh~/bash_profile~/.bashrc/etc/bashrc
进程管理{
ps-eaf#查看所有进程kill-9PID#强制终止某个PID进程kill-15PID#安全退出需程序内部处理信号cmd命令后台运行nohupcmd后台运行不受shell退出影响ctrl+z#将前台放入后台(暂停)jobs#查看后台运行程序bg2#启动后台暂停进程fg2#调回后台进程pstree#进程树vmstat19#每隔一秒报告系统性能信息9次sar#查看cpu等状态lsoffile#显示打开指定文件的所有进程lsof-i:32768#查看端口的进程renice+1180#把180号进程的优先级加1ps{
}top{
第四、五行:为内存信息。内容如下:Mem:191272ktotal物理内存总量173656kused使用的物理内存总量17616kfree空闲内存总量22052kbuffers用作内核缓存的内存量Swap:192772ktotal交换区总量0kused使用的交换区总量192772kfree空闲交换区总量123988kcached缓冲的交换区总量。内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,该数值即为这些内容已存在于内存中的交换区的大小。相应的内存再次被换出时可不必再对交换区写入。
进程信息区,各列的含义如下:#显示各个进程的详细信息
列出正在占用swap的进程{
}linux操作系统提供的信号{kill-l#查看linux提供的信号trap"echoaaa"2315#shell使用trap捕捉退出信号
#发送信号一般有两种原因:#1(被动式)内核检测到一个系统事件.例如子进程退出会像父进程发送SIGCHLD信号.键盘按下control+c会发送SIGINT信号#2(主动式)通过系统调用kill来向指定进程发送信号#进程结束信号SIGTERM和SIGKILL的区别:SIGTERM比较友好,进程能捕捉这个信号,根据您的需要来关闭程序。在关闭程序之前,您可以结束打开的记录文件和完成正在做的任务。在某些情况下,假如进程正在进行作业而且不能中断,那么进程可以忽略这个SIGTERM信号。#如果一个进程收到一个SIGUSR1信号,然后执行信号绑定函数,第二个SIGUSR2信号又来了,第一个信号没有被处理完毕的话,第二个信号就会丢弃。
日志管理{
selinux{
查看剩余内存{
free-m#-/+buffers/cache:64581649#6458M为真实使用内存1649M为真实剩余内存(剩余内存+缓存+缓冲器)#linux会利用所有的剩余内存作为缓存,所以要保证linux运行速度,就需要保证内存的缓存大小
}系统信息{
}硬件信息{
more/proc/cpuinfo#查看cpu信息lscpu#查看cpu信息cat/proc/cpuinfo|grepname|cut-f2-d:|uniq-c#查看cpu型号和逻辑核心数getconfLONG_BIT#cpu运行的位数cat/proc/cpuinfo|grep'physicalid'|sort|uniq-c#物理cpu个数cat/proc/cpuinfo|grepflags|grep'lm'|wc-l#结果大于0支持64位cat/proc/cpuinfo|grepflags#查看cpu是否支持虚拟化pae支持半虚拟化IntelVT支持全虚拟化more/proc/meminfo#查看内存信息dmidecode#查看全面硬件信息dmidecode|grep"ProductName"#查看服务器型号dmidecode|grep-P-A5"Memory\s+Device"|grepSize|grep-vRange#查看内存插槽cat/proc/mdstat#查看软raid信息cat/proc/scsi/scsi#查看Dell硬raid信息(IBM、HP需要官方检测工具)lspci#查看硬件信息lspci|grepRAID#查看是否支持raidlspci-vvv|grepEthernet#查看网卡型号lspci-vvv|grepKernel|grepdriver#查看驱动模块modinfotg2#查看驱动版本(驱动模块)ethtool-iem1#查看网卡驱动版本ethtoolem1#查看网卡带宽
}终端快捷键{
Ctrl+A#行前Ctrl+E#行尾Ctrl+S#终端锁屏Ctrl+Q#解锁屏Ctrl+D#退出
开机启动模式{
vi/etc/inittabid:3:initdefault:#3为多用户命令#ca::ctrlaltdel:/sbin/shutdown-t3-rnow#注释此行禁止ctrl+alt+del关闭计算机
终端提示显示{
echo$PS1#环境变量控制提示显示PS1='[\u@\H\w\A\@#]\$'PS1='[\u@\h\W]\$'
定时任务{
at5pm+3days/bin/ls#单次定时任务指定三天后下午5:00执行/bin/lscrontab-e#编辑周期任务#分钟小时天月星期命令或脚本1,301-3/2***命令或脚本>>file.log2>&1echo"407**2/root/sh">>/var/spool/cron/root#直接将命令写入周期任务crontab-l#查看自动周期性任务crontab-r#删除自动周期性任务cron.deny和cron.allow#禁止或允许用户使用周期任务servicecrondstart|stop|restart#启动自动周期性服务*****echo"d">>d$(date+\%Y\%m\%d).log#让定时任务直接生成带日期的log需要转义%
date{星期日[SUN]星期一[MON]星期二[TUE]星期三[WED]星期四[THU]星期五[FRI]星期六[SAT]一月[JAN]二月[FEB]三月[MAR]四月[APR]五月[MAY]六月[JUN]七月[JUL]八月[AUG]九月[SEP]十月[OCT]十一月[NOV]十二月[DEC]
limits.conf{
ulimit-SHn65535#临时设置文件描述符大小进程最大打开文件柄数还有socket最大连接数,等同配置nofileulimit-SHu65535#临时设置用户最大进程数ulimit-a#查看
/etc/security/limits.conf
#文件描述符大小openfiles#lsof|wc-l查看当前文件句柄数使用数量*softnofile16384#设置太大,进程使用过多会把机器拖死*hardnofile32768
#用户最大进程数maxuserprocesses#echo$((`psuxm|wc-l`-`psux|wc-l`))查看当前用户占用的进程数[包括线程]usersoftnproc16384userhardnproc32768
#如果/etc/security/limits.d/有配置文件,将会覆盖/etc/security/limits.conf里的配置#即/etc/security/limits.d/的配置文件里就不要有同样的参量设置/etc/security/limits.d/90-nproc.conf#centos6.3的默认这个文件会覆盖limits.confusersoftnproc16384userhardnproc32768
sysctl-p#修改配置文件后让系统生效
百万长链接设置{#内存消耗需要较大vim/root/.bash_profile#添加如下2行,退出bash重新登陆echo20000500>/proc/sys/fs/nr_openulimit-n10000000
libc.so故障修复{
#由于升级glibc导致libc.so不稳定,突然报错,幸好还有未退出的终端grep:errorwhileloadingsharedlibraries:/lib64/libc.so.6:ELFfileOSABIinvalid
#看看当前系统有多少版本libc.sols/lib64/libc-[tab]
#更改环境变量指向其他libc.so文件测试exportLD_PRELOAD=/lib64/libc-2.7.so#如果不改变LD_PRELOAD变量,ln不能用,需要使用/sbin/sln命令做链接
#当前如果好使了,在执行下面强制替换软链接。如不好使,测试其他版本的libc.so文件ln-f-s/lib64/libc-2.7.so/lib64/libc.so.6
sudo{
echomyPassword|sudo-Sls/tmp#直接输入sudo的密码非交互,从标准输入读取密码而不是终端设备visudo#sudo命令权限添加/etc/sudoers用户别名(可用all)=NOPASSWD:命令1,命令2userALL=NOPASSWD:/bin/su#免root密码切换root身份wangminglinuxfan=NOPASSWD:/sbin/apachestart,/sbin/apacherestartUserNameALL=(ALL)ALLUserNameALL=(ALL)NOPASSWD:ALLpeterliALL=(ALL)NOPASSWD:/sbin/serviceDefaultsrequiretty#sudo不允许后台运行,注释此行既允许Defaults!visiblepw#sudo不允许远程,去掉!既允许
grub开机启动项添加{
vim/etc/grub.conftitlems-dosrootnoverify(hd0,0)chainloader+1
stty{
#stty时一个用来改变并打印终端行设置的常用命令
sttyiuclc#在命令行下禁止输出大写stty-iuclc#恢复输出大写sttyolcuc#在命令行下禁止输出小写stty-olcuc#恢复输出小写sttysize#打印出终端的行数和列数sttyeof"string"#改变系统默认ctrl+D来表示文件的结束stty-echo#禁止回显sttyecho#打开回显stty-echo;read;sttyecho;read#测试禁止回显sttyigncr#忽略回车符stty-igncr#恢复回车符sttyerase'#'#将#设置为退格字符sttyerase'^'#恢复退格字符定时输入{timeout_read(){timeout=$1old_stty_settings=`stty-g`#savecurrentsettingsstty-icanonmin0time100#set10seconds,not100secondsevalreadvarname#=read$varnamestty"$old_stty_settings"#recoversettings}read-t10varname#更简单的方法就是利用read命令的-t选项}
检测用户按键{
#!/bin/bashold_tty_settings=$(stty-g)#保存老的设置(为什么).stty-icanonKeypress=$(head-c1)#或者使用$(ddbs=1count=12>/dev/null)echo"Keypressedwas\""$Keypress"\"."stty"$old_tty_settings"#恢复老的设置.exit0
iptables{
内建三个表:natmangle和filterfilter预设规则表,有INPUT、FORWARD和OUTPUT三个规则链vi/etc/sysconfig/iptables#配置文件INPUT#进入FORWARD#转发OUTPUT#出去ACCEPT#将封包放行REJECT#拦阻该封包DROP#丢弃封包不予处理-A#在所选择的链(INPUT等)末添加一条或更多规则-D#删除一条-E#修改-p#tcp、udp、icmp0相当于所有all!取反-P#设置缺省策略(与所有链都不匹配强制使用此策略)-s#IP/掩码(IP/24)主机名、网络名和清楚的IP地址!取反-j#目标跳转,立即决定包的命运的专用内建目标-i#进入的(网络)接口[名称]eth0-o#输出接口[名称]-m#模块--sport#源端口--dport#目标端口iptables-F#将防火墙中的规则条目清除掉#注意:iptables-PINPUTACCEPTiptables-restore<规则文件#导入防火墙规则/etc/init.d/iptablessave#保存防火墙设置/etc/init.d/iptablesrestart#重启防火墙服务iptables-L-n#查看规则iptables-tnat-nL#查看转发
iptables配置实例文件{
iptables配置实例{
#允许某段IP访问任何端口iptables-AINPUT-s192.168.0.3/24-ptcp-jACCEPT#设定预设规则(拒绝所有的数据包,再允许需要的,如只做WEB服务器.还是推荐三个链都是DROP)iptables-PINPUTDROPiptables-PFORWARDDROPiptables-POUTPUTACCEPT#注意:直接设置这三条会掉线#开启22端口iptables-AINPUT-ptcp--dport22-jACCEPT#如果OUTPUT设置成DROP的,要写上下面一条iptables-AOUTPUT-ptcp--sport22-jACCEPT#注:不写导致无法SSH.其他的端口一样,OUTPUT设置成DROP的话,也要添加一条链#如果开启了web服务器,OUTPUT设置成DROP的话,同样也要添加一条链iptables-AOUTPUT-ptcp--sport80-jACCEPT#做WEB服务器,开启80端口,其他同理iptables-AINPUT-ptcp--dport80-jACCEPT#做邮件服务器,开启25,110端口iptables-AINPUT-ptcp--dport110-jACCEPTiptables-AINPUT-ptcp--dport25-jACCEPT#允许icmp包通过,允许pingiptables-AOUTPUT-picmp-jACCEPT(OUTPUT设置成DROP的话)iptables-AINPUT-picmp-jACCEPT(INPUT设置成DROP的话)#允许loopback!(不然会导致DNS无法正常关闭等问题)IPTABLES-AINPUT-ilo-pall-jACCEPT(如果是INPUTDROP)IPTABLES-AOUTPUT-olo-pall-jACCEPT(如果是OUTPUTDROP)
centos6的iptables基本配置{*filter:INPUTACCEPT[0:0]:FORWARDACCEPT[0:0]:OUTPUTACCEPT[0:0]-AINPUT-mstate--stateESTABLISHED,RELATED-jACCEPT-AINPUT-picmp-jACCEPT-AINPUT-ilo-jACCEPT-AINPUT-s222.186.135.61-ptcp-jACCEPT-AINPUT-ptcp--dport80-jACCEPT-AINPUT-mstate--stateNEW-mtcp-ptcp--dport22-jACCEPT-AINPUT-jREJECT--reject-withicmp-host-prohibited-AINPUT-ptcp-mtcp--tcp-flagsFIN,SYN,RST,PSH,URGRST-jDROP-AFORWARD-jREJECT--reject-withicmp-host-prohibitedCOMMIT}
添加网段转发{
#例如通过vpn上网echo1>/proc/sys/net/ipv4/ip_forward#在内核里打开ip转发功能iptables-tnat-APOSTROUTING-s10.8.0.0/24-jMASQUERADE#添加网段转发iptables-tnat-APOSTROUTING-s10.0.0.0/255.0.0.0-oeth0-jSNAT--to192.168.10.158#原IP网段经过哪个网卡IP出去iptables-tnat-nL#查看转发
端口映射{#内网通过有外网IP的机器映射端口#内网主机添加路由routeadd-net10.10.20.0netmask255.255.255.0gw10.10.20.111#内网需要添加默认网关,并且网关开启转发#网关主机echo1>/proc/sys/net/ipv4/ip_forward#在内核里打开ip转发功能iptables-tnat-APREROUTING-d外网IP-ptcp--dport9999-jDNAT--to10.10.20.55:22#进入iptables-tnat-APOSTROUTING-s10.10.20.0/24-jSNAT--to外网IP#转发回去iptables-tnat-nL#查看转发
4服务{
chkconfig{
nginx{
yuminstall-ymakegccopenssl-develpcre-develbzip2-devellibxml2libxml2-develcurl-devellibmcrypt-devellibjpeglibjpeg-devellibpnglibpng-developenssl
groupaddnginxuseraddnginx-gnginx-M-s/sbin/nologinmkdir-p/opt/nginx-tmp
#./configure--help#--with#默认不加载需指定编译此参数才使用#--without#默认加载,可用此参数禁用#--add-module=path#添加模块的路径#--add-module=/opt/ngx_module_upstream_check\#nginx代理状态页面#ngx_module_upstream_check编译前需要打对应版本补丁patch-p1
make&&makeinstall
/usr/local/nginx/sbin/nginx–t#检查Nginx配置文件但并不执行/usr/local/nginx/sbin/nginx-t-c/opt/nginx/conf/nginx.conf#检查Nginx配置文件/usr/local/nginx/sbin/nginx#启动nginx/usr/local/nginx/sbin/nginx-sreload#重载配置/usr/local/nginx/sbin/nginx-sstop#关闭nginx服务
编译参数{
#so模块用来提供DSO支持的apache核心模块#如果编译中包含任何DSO模块,则mod_so会被自动包含进核心。#如果希望核心能够装载DSO,但不实际编译任何DSO模块,则需明确指定"--enable-so=static"
./configure--prefix=/usr/local/apache--enable-so--enable-mods-shared=most--enable-rewrite--enable-forward#实例编译
转发{
mysql源码安装{groupaddmysqluseraddmysql-gmysql-M-s/bin/falsetarzxvfmysql-5.0.22.tar.gzcdmysql-5.0.22./configure--prefix=/usr/local/mysql\--with-client-ldflags=-all-static\--with-mysqld-ldflags=-all-static\--with-mysqld-user=mysql\--with-extra-charsets=all\--with-unix-socket-path=/var/tmp/mysql.sockmake&&makeinstall#生成mysql用户数据库和表文件,在安装包中输入scripts/mysql_install_db--user=mysqlvi~/.bashrcexportPATH="$PATH:/usr/local/mysql/bin"#配置文件,有large,medium,small三个,根据机器性能选择cpsupport-files/my-medium.cnf/etc/my.cnfcpsupport-files/mysql.server/etc/init.d/mysqldchmod700/etc/init.d/mysqldcd/usr/localchmod750mysql-Rchgrpmysqlmysql-Rchownmysqlmysql/var-Rcp/usr/local/mysql/libexec/mysqldmysqld.oldln-s/usr/local/mysql/bin/mysql/sbin/mysqlln-s/usr/local/mysql/bin/mysqladmin/sbin/mysqladminln-s-f/usr/local/mysql/bin/mysqld_safe/etc/rc.d/rc3.d/S15mysql5ln-s-f/usr/local/mysql/bin/mysqld_safe/etc/rc.d/rc0.d/K15mysql5}
mysql常用命令{./mysql/bin/mysqld_safe--user=mysql启动mysql服务./mysql/bin/mysqladmin-uroot-p-S./mysql/data/mysql.sockshutdown#停止mysql服务mysqlcheck-uroot-p-Smysql.sock--optimize--databasesaccount#检查、修复、优化MyISAM表mysqlbinlogslave-relay-bin.000001#查看二进制日志(报错加绝对路径)mysqladmin-hmyhost-uroot-pcreatedbname#创建数据库
#格式:mysql-h主机地址-u用户名-p用户密码mysql-h110.110.110.110-P3306-uroot-pmysql-uroot-p-S/data1/mysql5/data/mysql.sock-A--default-character-set=GBK
shell执行mysql命令{mysql-uroot-p'123'xuesong 备份数据库{ mysqldump-hhost-uroot-p--default-character-set=utf8dbname>dbname_backup.sql#不包括库名,还原需先创建库,在usemysqldump-hhost-uroot-p--database--default-character-set=utf8dbname>dbname_backup.sql#包括库名,还原不需要创建库/bin/mysqlhotcopy-uroot-p#mysqlhotcopy只能备份MyISAM引擎mysqldump-uroot-p-Smysql.sock--default-character-set=utf8dbnametable1table2>/data/db.sql#备份表mysqldump-uroot-p123-ddatabase>database.sql#备份数据库结构innobackupex--user=root--password=""--defaults-file=/data/mysql5/data/my_3306.cnf--socket=/data/mysql5/data/mysql.sock--slave-info--stream=tar--tmpdir=/data/dbbackup/temp/data/dbbackup/2>/data/dbbackup/dbbackup.log|gzip1>/data/dbbackup/db50.tar.gz#xtrabackup备份需单独安装软件优点:速度快,压力小,可直接恢复主从复制 还原数据库{ mysql-hhost-uroot-pdbname 赋权限{ #指定IP:$IP本机:localhost所有IP地址:%#通常指定多条grantallonzabbix.*touser@"$IP";#对现有账号赋予权限grantselectondatabase.*touser@"%"Identifiedby"passwd";#赋予查询权限(没有用户,直接创建)grantallprivilegesondatabase.*touser@"$IP"identifiedby'passwd';#赋予指定IP指定用户所有权限(不允许对当前库给其他用户赋权限)grantallprivilegesondatabase.*touser@"localhost"identifiedby'passwd'withgrantoption;#赋予本机指定用户所有权限(允许对当前库给其他用户赋权限)grantselect,insert,update,deleteondatabase.*touser@'ip'identifiedby"passwd";#开放管理操作指令revokeallon*.*fromuser@localhost;#回收权限 更改密码{ updateusersetpassword=password('passwd')whereuser='root'mysqladmin-urootpassword'xuesong' mysql忘记密码后重置{ cd/data/mysql5/data/mysql5/bin/mysqld_safe--user=mysql--skip-grant-tables--skip-networking&usemysql;updateusersetpassword=password('123123')whereuser='root'; mysql主从复制失败恢复{ slavestop;resetslave;changemastertomaster_host='10.10.10.110',master_port=3306,master_user='repl',master_password='repl',master_log_file='master-bin.000010',master_log_pos=107,master_connect_retry=60;slavestart; sql语句使用变量{ 检测mysql主从复制延迟{1、在从库定时执行更新主库中的一个timeout数值2、同时取出从库中的timeout值对比判断从库与主库的延迟} mysql慢查询{select*frominformation_schema.processlistwherecommandin('Query')andtime>5\G#查询操作大于5S的进程 }mysqldumpslow慢查询日志查看{ }} mysql操作次数查询{ select*frominformation_schema.global_status; com_selectcom_deletecom_insertcom_update mongodb{ 一、启动{#不启动认证./mongod--port27017--fork--logpath=/opt/mongodb/mongodb.log--logappend--dbpath=/opt/mongodb/data/#启动认证./mongod--port27017--fork--logpath=/opt/mongodb/mongodb.log--logappend--dbpath=/opt/mongodb/data/--auth 二、关闭{ #方法:kill传递信号两种皆可kill-2pidkill-15pid 三、开启认证与用户管理{ #恢复密码只需要重启mongodb不加--auth参数 五、查看状态{ #状态信息从服务器启动开始计算,如果过大就会复位,发送复位,所有计数都会复位,asserts中的roolovers值增加 六、常用命令{ db.listCommands()#当前MongoDB支持的所有命令(同样可通过运行命令db.runCommand({"listCommands":`1})来查询所有命令) 七、进程控制{ db.currentOp()#查看活动进程db.$cmd.sys.inprog.findOne()#查看活动进程与上面一样opid#操作进程号op#操作类型(查询\更新)ns#命名空间,指操作的是哪个对象query#如果操作类型是查询,这里将显示具体的查询内容lockType#锁的类型,指明是读锁还是写锁 db.killOp(opid值)#结束进程db.$cmd.sys.killop.findOne({op:opid值})#结束进程 八、备份还原{ ./mongoexport-dtest-ct1-ot1.dat#导出JSON格式-c#指明导出集合-d#使用库./mongoexport-dtest-ct1-csv-fnum-ot1.dat#导出csv格式-csv#指明导出csv格式-f#指明需要导出那些例 ./mongodump-dtest-o/bak/mongodump#mongodump数据备份./mongorestore-dtest--drop/bak/mongodump/*#mongorestore恢复--drop#恢复前先删除db.t1.find()#查看 #mongodump虽然能不停机备份,但市区了获取实时数据视图的能力,使用fsync命令能在运行时复制数据目录并且不会损坏数据#fsync会强制服务器将所有缓冲区的数据写入磁盘.配合lock还阻止对数据库的进一步写入,知道释放锁为止#备份在从库上备份,不耽误读写还能保证实时快照备份db.runCommand({"fsync":1,"lock":1})#执行强制更新与写入锁db.$cmd.sys.unlock.findOne()#解锁db.currentOp()#查看解锁是否正常 九、修复{ 十、python使用mongodb{ 文档添加,_id自动创建importdatetimepost={"author":"Mike","text":"Myfirstblogpost!","tags":["mongodb","python","pymongo"],"date":datetime.datetime.utcnow()}posts=db.postsposts.insert(post)ObjectId('...') 批量插入new_posts=[{"author":"Mike","text":"Anotherpost!","tags":["bulk","insert"],"date":datetime.datetime(2009,11,12,11,14)},{"author":"Eliot","title":"MongoDBisfun","text":"andprettyeasytoo!","date":datetime.datetime(2009,11,10,10,45)}]posts.insert(new_posts)[ObjectId('...'),ObjectId('...')]获取所有collectiondb.collection_names()#相当于SQL的showtables获取单个文档posts.find_one() 查询多个文档forpostinposts.find():post 加条件的查询posts.find_one({"author":"Mike"}) 高级查询posts.find({"date":{"$lt":"d"}}).sort("author") 统计数量posts.count() 加索引frompymongoimportASCENDING,DESCENDINGposts.create_index([("date",DESCENDING),("author",ASCENDING)]) 查看查询语句的性能posts.find({"date":{"$lt":"d"}}).sort("author").explain()["cursor"]posts.find({"date":{"$lt":"d"}}).sort("author").explain()["nscanned"] JDK安装{ chmod744jdk-1.7.0_79-linux-i586.bin./jdk-1.7.0_79-linux-i586.binvi/etc/profile#添加环境变量JAVA_HOME=/usr/java/jdk1.7.0_79CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/tools.jarPATH=$JAVA_HOME/bin:$PATHexportJAVA_HOMEPATHCLASSPATH ./etc/profile#加载新的环境变量jps-ml#查看java进程} redis动态加内存{ ./redis-cli-h10.10.10.11-p6401save#保存当前快照configget*#列出所有当前配置configgetmaxmemory#查看指定配置configsetmaxmemory15360000000#动态修改最大内存配置参数 nfs{ #依赖rpc服务通信portmap[centos5]或rpcbind[centos6]yuminstallnfs-utilsportmap#centos5安装yuminstallnfs-utilsrpcbind#centos6安装 vim/etc/exports#配置文件#sync#同步写入#async#暂存并非直接写入#no_root_squash#开放用户端使用root身份操作#root_squash#使用者身份为root则被压缩成匿名使用,即nobody,相对安全#all_squash#所有NFS的使用者身份都被压缩为匿名/data/images10.10.10.0/24(rw,sync,no_root_squash) serviceportmaprestart#重启centos5的nfs依赖的rpc服务servicerpcbindrestart#重启centos6的nfs依赖的rpc服务servicenfsrestart#重启nfs服务确保依赖portmap或rpcbind服务已启动servicenfsreload#重载NFS服务配置文件showmount-e#服务端查看自己共享的服务showmount-a#显示已经与客户端连接上的目录信息showmount-e10.10.10.3#列出服务端可供使用的NFS共享客户端测试能否访问nfs服务mount-tnfs10.10.10.3:/data/images//data/img#挂载nfs如果延迟影响大加参数noac hdfs{hdfs--help#所有参数 hdfsdfs-help#运行文件系统命令在Hadoop文件系统hdfsdfs-ls/logs#查看hdfsdfs-ls/user/#查看用户hdfsdfs-cathdfsdfs-dfhdfsdfs-duhdfsdfs-rmhdfsdfs-tail hdfsdfsadmin-help#hdfs集群节点管理hdfsdfsadmin-report#基本的文件系统统计信息} 5网络{ watchmore/proc/net/dev#实时监控流量文件系统累计值iptraf#网卡流量查看工具nethogs-d5eth0eth1#按进程实时统计网络流量epel源nethogssar{-n参数有6个不同的开关:DEV|EDEV|NFS|NFSD|SOCK|ALLDEV显示网络接口信息EDEV显示关于网络错误的统计数据NFS统计活动的NFS客户端的信息NFSD统计NFS服务器的信息SOCK显示套接字信息ALL显示所有5个开关sar-nDEV110rxpck/s#每秒钟接收的数据包txpck/s#每秒钟发送的数据包rxbyt/s#每秒钟接收的字节数txbyt/s#每秒钟发送的字节数rxcmp/s#每秒钟接收的压缩数据包txcmp/s#每秒钟发送的压缩数据包rxmcst/s#每秒钟接收的多播数据包} }netstat{ #几十万并发的情况下netstat会没有响应,建议使用ss命令-a#显示所有连接中的Socket-t#显示TCP连接-u#显示UDP连接-n#显示所有已建立的有效连接netstat-anlp#查看链接netstat-tnlp#只查看tcp监听端口netstat-r#查看路由表} ss{ }并发数查看{ netstat-n|awk'/^tcp/{++S[$NF]}END{for(ainS)printa,S[a]}'SYN_RECV#正在等待处理的请求ESTABLISHED#正常数据传输状态,既当前并发数TIME_WAIT#处理完毕,等待超时结束的请求CLOSE_WAIT#客户端异常关闭,没有完成4次挥手如大量可能存在攻击行为 ssh{ SSH反向连接{ #外网A要控制内网B ssh-NfR1234:localhost:2223user1@123.123.123.123-p22#将A主机的1234端口和B主机的2223端口绑定,相当于远程端口映射ss-ant#这时在A主机上sshd会listen本地1234端口#LISTEN0128127.0.0.1:1234*:*sshlocalhost-p1234#在A主机连接本地1234端口 网卡配置文件{ vi/etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0BOOTPROTO=noneBROADCAST=192.168.1.255HWADDR=00:0C:29:3F:E1:EAIPADDR=192.168.1.55NETMASK=255.255.255.0NETWORK=192.168.1.0ONBOOT=yesTYPE=EthernetGATEWAY=192.168.1.1#ARPCHECK=no#进制arp检查 route{ route#查看路由表routeadddefaultgw192.168.1.1deveth0#添加默认路由routeadd-net172.16.0.0netmask255.255.0.0gw10.39.111.254#添加静态路由网关routedel-net172.16.0.0netmask255.255.0.0gw10.39.111.254#删除静态路由网关 静态路由{ vim/etc/sysconfig/static-routesanynet192.168.12.0/24gw192.168.0.254anynet192.168.13.0/24gw192.168.0.254 解决ssh链接慢{ sed-i's/GSSAPIAuthenticationyes/GSSAPIAuthenticationno/'/etc/ssh/sshd_configsed-i'/#UseDNSyes/a\UseDNSno'/etc/ssh/sshd_config/etc/init.d/sshdrestart ftp上传{ ftp-i-v-n$HOST< nmap{ nmap-PT192.168.1.1-111#先ping在扫描主机开放端口nmap-O192.168.1.1#扫描出系统内核版本nmap-sV192.168.1.1-111#扫描端口的软件版本nmap-sS192.168.1.1-111#半开扫描(通常不会记录日志)nmap-P0192.168.1.1-111#不ping直接扫描nmap-d192.168.1.1-111#详细信息nmap-D192.168.1.1-111#无法找出真正扫描主机(隐藏IP)nmap-p20-30,139,60000-#端口范围表示:扫描20到30号端口,139号端口以及所有大于60000的端口nmap-P0-sV-O-v192.168.30.251#组合扫描(不ping、软件版本、内核版本、详细信息)#不支持windows的扫描(可用于判断是否是windows)nmap-sF192.168.1.1-111nmap-sX192.168.1.1-111nmap-sN192.168.1.1-111 流量切分线路{ #程序判断进入IP线路,设置服务器路由规则控制返回vi/etc/iproute2/rt_tables#添加一条策略252bgp2#注意策略的序号顺序iprouteadddefaultvia第二个出口上线IP(非默认网关)deveth1tablebgp2iprouteaddfrom本机第二个iptablebgp2#查看iproutelisttable252iprulelist#成功后将语句添加开机启动 创建swap文件方法{ ddif=/dev/zeroof=/swapbs=1024count=4096000#创建一个足够大的文件#count的值等于1024x你想要的文件大小,4096000是4Gmkswap/swap#把这个文件变成swap文件swapon/swap#启用这个swap文件/swapswapswapdefaults00#在每次开机的时候自动加载swap文件,需要在/etc/fstab文件中增加一行cat/proc/swaps#查看swapswapoff-a#关闭swapswapon-a#开启swap 新硬盘挂载{ fdisk/dev/sdcp#打印分区d#删除分区n#创建分区,(一块硬盘最多4个主分区,扩展占一个主分区位置。p主分区e扩展)w#保存退出mkfs-text3-L卷标/dev/sdc1#格式化相应分区mount/dev/sdc1/mnt#挂载vi/etc/fstab#添加开机挂载分区LABEL=/data/dataext3defaults12#用卷标挂载/dev/sdb1/data4ext3defaults12#用真实分区挂载/dev/sdb2/data4ext3noatime,defaults12 第一个数字"1"该选项被"dump"命令使用来检查一个文件系统应该以多快频率进行转储,若不需要转储就设置该字段为0第二个数字"2"该字段被fsck命令用来决定在启动时需要被扫描的文件系统的顺序,根文件系统"/"对应该字段的值应该为1,其他文件系统应该为2。若该文件系统无需在启动时扫描则设置该字段为0当以noatime选项加载(mount)文件系统时,对文件的读取不会更新文件属性中的atime信息。设置noatime的重要性是消除了文件系统对文件的写操作,文件只是简单地被系统读取。由于写操作相对读来说要更消耗系统资源,所以这样设置可以明显提高服务器的性能.wtime信息仍然有效,任何时候文件被写,该信息仍被更新。 大磁盘2T和16T分区{ parted/dev/sdb#针对磁盘分区(parted)mklabelgpt#设置为gpt(parted)print(parted)mkpartprimary0KB22.0TB#指定分区大小IsthisstillacceptabletoyouYes/NoYesIgnore/CancelIgnore(parted)printModel:LSIMR9271-8i(scsi)Disk/dev/sdb:22.0TBSectorsize(logical/physical):512B/512BPartitionTable:gptNumberStartEndSizeFilesystemNameFlags117.4kB22.0TB22.0TBprimary(parted)quit mkfs.ext4-b4096/dev/sdb1#小于16T如使用ext4指定块大小块大小影响磁盘分区大小 #大于16T的单个分区ext4格式化报错Sizeofdevice/dev/sdb1toobigtobeexpressedin32bitsusingablocksizeof4096.#修改ext4的文件添加一行,解决ext4格式化大于16T报错vim/etc/mke2fs.conf [fs_types]ext4={features=has_journal,extent,huge_file,flex_bg,uninit_bg,dir_nlink,extra_isizeauto_64-bit_support=1#添加此行inode_size=256} yum-yinstallxfsprogsmkfs.xfs-f/dev/sdb1#大于16T单个分区或使用XFS分区也可 raid原理与区别{ raid0至少2块硬盘.吞吐量大,性能好,同时读写,但损坏一个就完蛋raid1至少2块硬盘.相当镜像,一个存储,一个备份.安全性比较高.但是性能比0弱raid5至少3块硬盘.分别存储校验信息和数据,坏了一个根据校验信息能恢复raid6至少4块硬盘.两个独立的奇偶系统,可坏两块磁盘,写性能非常差 7用户{ #即进入单用户模式:在linux出现grub后,在安装的系统上面按"e",然后出现grub的配置文件,按键盘移动光标到第二行"Ker……",再按"e",然后在这一行的结尾加上:空格single或者空格1回车,然后按"b"重启,就进入了"单用户模式"}特殊权限{ s或S(SUID):对应数值4s或S(SGID):对应数值2t或T:对应数值1大S:代表拥有root权限,但是没有执行权限小s:拥有特权且拥有执行权限,这个文件可以访问系统任何root用户可以访问的资源T或T(Sticky):/tmp和/var/tmp目录供所有用户暂时存取文件,亦即每位用户皆拥有完整的权限进入该目录,去浏览、删除和移动文件 正则表达式{^#行首定位$#行尾定位.#匹配除换行符以外的任意字符*#匹配0或多个重复字符+#重复一次或更多次#重复零次或一次#结束贪婪因子.*表示最小匹配[]#匹配一组中任意一个字符[^]#匹配不在指定组内的字符\#用来转义元字符<#词首定位符(支持vi和grep) 元字符{ \d#匹配任意一位数字\D#匹配任意单个非数字字符\w#匹配任意单个字母数字下划线字符,同义词是[:alnum:]\W#匹配非数字型的字符 字符类:空白字符{ \s#匹配任意的空白符\S#匹配非空白字符\b#匹配单词的开始或结束\n#匹配换行符\r#匹配回车符\t#匹配制表符\b#匹配退格符\0#匹配空值字符 字符类:锚定字符{ \b#匹配字边界(不在[]中时)\B#匹配非字边界\A#匹配字符串开头\Z#匹配字符串或行的末尾\z#只匹配字符串末尾\G#匹配前一次m//g离开之处 捕获{ (exp)#匹配exp,并捕获文本到自动命名的组里( 零宽断言{ (=exp)#匹配exp前面的位置(<=exp)#匹配exp后面的位置(!exp)#匹配后面跟的不是exp的位置( 特殊字符{ 流程结构{if判断{ if[$a==$b]thenecho"等于"elseecho"不等于"fi }case分支选择{ case$xsin0)echo"0";;1)echo"1";;*)echo"其他";;esac }while循环{ #whiletrue等同while:#读文件为整行读入num=1while[$num-lt10]doecho$num((num=$num+2))done###########################grepaa.txt|whilereadadoecho$adone###########################whilereadadoecho$adone }for循环{ #读文件已空格分隔w=`awk-F":"'{print$1}'c`fordin$wdo$ddone###########################for((i=0;i<${#o[*]};i++))doecho${o[$i]}done }until循环{ #当command不为0时循环untilcommanddobodydone }流程控制{ breakN#跳出几层循环continueN#跳出几层循环,循环次数不变continue#重新循环次数不变 变量{A="abcdef"#将字符串复制给变量A=`cmd`#将命令结果赋给变量A=$(cmd)#将命令结果赋给变量evala=\$$a#间接调用i=2&&echo$((i+3))#计算后打印新变量结果i=2&&echo$[i+3]#计算后打印新变量结果a=$((2>65:8))#判断两个值满足条件的赋值给变量$1$2$*#位置参数*代表所有env#查看环境变量env|grep"name"#查看定义的环境变量set#查看环境变量和本地变量readname#输入变量readonlyname#把name这个变量设置为只读变量,不允许再次设置readonly#查看系统存在的只读文件exportname#变量name由本地升为环境exportname="RedHat"#直接定义name为环境变量exportStat$nu=2222#变量引用变量赋值unsetname#变量清除export-nname#去掉只读变量shift#用于移动位置变量,调整位置变量,使$3的值赋给$2.$2的值赋予$1name+0#将字符串转换为数字number""#将数字转换成字符串a='ee';b='a';echo${!b}#间接引用name变量的值:${a="cc"}#如果a有值则不改变,如果a无值则赋值a变量为cc 数组{ A=(abcdef)#将变量定义为数組${#A[*]}#数组个数${A[*]}#数组所有元素,大字符串${A[@]}#数组所有元素,类似列表可迭代${A[2]}#脚本的一个参数或数组第三位} 定义变量类型{ declare或typeset-r只读(readonly一样)-i整形-a数组-f函数-xexportdeclare-in=0 系统变量{ $0#脚本启动名(包括路径)$n#第n个参数,n=1,2,…9$*#所有参数列表(不包括脚本本身)$@#所有参数列表(独立字符串)$##参数个数(不包括脚本本身)$$#当前程式的PID$!#执行上一个指令的PID$#执行上一个指令的返回值 变量引用技巧{ }}test条件判断{ #符号[]等同test命令 expression为字符串操作{ -nstr#字符串str是否不为空-zstr#字符串str是否为空 expression为文件操作{ -a#并且,两条件为真-b#是否块文件-p#文件是否为一个命名管道-c#是否字符文件-r#文件是否可读-d#是否一个目录-s#文件的长度是否不为零-e#文件是否存在-S#是否为套接字文件-f#是否普通文件-x#文件是否可执行,则为真-g#是否设置了文件的SGID位-u#是否设置了文件的SUID位-G#文件是否存在且归该组所有-w#文件是否可写,则为真-k#文件是否设置了的粘贴位-tfd#fd是否是个和终端相连的打开的文件描述符(fd默认为1)-o#或,一个条件为真-O#文件是否存在且归该用户所有!#取反 expression为整数操作{ expr1-aexpr2#如果expr1和expr2评估为真,则为真expr1-oexpr2#如果expr1或expr2评估为真,则为真 两值比较{ 整数字符串-lt<#小于-gt>#大于-le<=#小于或等于-ge>=#大于或等于-eq==#等于-ne!=#不等于 test10-lt5#判断大小echo$#查看上句test命令返回状态#结果0为真,1为假test-n"hello"#判断字符串长度是否为0[$-eq0]&&echo"success"||exit#判断成功提示,失败则退出 }重定向{#标准输出stdout和标准错误stderr标准输入stdincmd1>fiel#把标准输出重定向到file文件中cmd>file2>&1#把标准输出和标准错误一起重定向到file文件中cmd2>file#把标准错误重定向到file文件中cmd2>>file#把标准错误重定向到file文件中(追加)cmd>>file2>&1#把标准输出和标准错误一起重定向到file文件中(追加)cmd >&n#使用系统调用dup(2)复制文件描述符n并把结果用作标准输出<&n#标准输入复制自文件描述符n<&-#关闭标准输入(键盘)>&-#关闭标准输出n<&-#表示将n号输入关闭n>&-#表示将n号输出关闭 }运算符{$[]等同于$(())#$[]表示形式告诉shell求中括号中的表达式的值~var#按位取反运算符,把var中所有的二进制为1的变为0,为0的变为1var\< 运算符优先级{级别运算符说明1=,+=,-=,/=,%=,*=,&=,^=,|=,<<=,>>=#赋值运算符2||#逻辑或前面不成功执行3&逻辑与前面成功后执行4|#按位或5^#按位异或6按位与7==,!=#等于/不等于8<=,>=,<,>#小于或等于/大于或等于/小于/大于9\<<,>>#按位左移/按位右移(无转意符号)10+,-#加减11*,/,%#乘,除,取余12!,~#逻辑非,按位取反或补码13-,+#正负}} 数学运算{$(())#整数运算+-*/**#分別为"加、減、乘、除、密运算"&|^!#分別为"AND、OR、XOR、NOT"运算%#余数运算 let{let#运算letx=16/4letx=5**5} expr{expr14%9#整数运算SUM=`expr2\*3`#乘后结果赋值给变量LOOP=`expr$LOOP+1`#增量计数(加循环即可)LOOP=0exprlength"bkeepzbb"#计算字串长度exprsubstr"bkeepzbb"49#抓取字串exprindex"bkeepzbb"e#抓取第一个字符数字串出现的位置expr30/3/2#运算符号有空格exprbkeep.doc:'.*'#模式匹配(可以使用expr通过指定冒号选项计算字符串中字符数)exprbkeep.doc:'\(.*\).doc'#在expr中可以使用字符串匹配操作,这里使用模式抽取.doc文件附属名 数值测试{ #如果试图计算非整数,则会返回错误rr=3.4expr$rr+1expr:non-numericargumentrr=5expr$rr+16 }}bc{ echo"m^n"|bc#次方计算seq-s'+'1000|bc#从1加到1000seq11000|tr"\n""+"|sed's/+$/\n/'|bc#从1加到1000}}grep{ -c#显示匹配到得行的数目,不显示内容-h#不显示文件名-i#忽略大小写-l#只列出匹配行所在文件的文件名-n#在每一行中加上相对行号-s#无声操作只显示报错,检查退出状态-v#反向查找-e#使用正则表达式-w#精确匹配-wc#精确匹配次数-o#查询所有匹配字段-P#使用perl正则表达式-A3#打印匹配行和下三行-B3#打印匹配行和上三行-C3#打印匹配行和上下三行 grep-v"a"txt#过滤关键字符行grep-w'a\>'txt#精确匹配字符串grep-i"a"txt#大小写敏感grep"a[bB]"txt#同时匹配大小写grep'[0-9]\{3\}'txt#查找0-9重复三次的所在行grep-E"word1|word2|word3"file#任意条件匹配grepword1file|grepword2|grepword3#同时匹配三个echoquan@163.com|grep-Po'(<=@.).*(=.$)'#零宽断言截取字符串#63.coecho"I'msingingwhileyou'redancing"|grep-Po'\b\w+(=ing\b)'#零宽断言匹配echo'RxOpticalPower:-5.01dBm,TxOpticalPower:-2.41dBm'|grep-Po'(<=:).*(=d)'#取出d前面数字#为最小匹配echo'RxOpticalPower:-5.01dBm,TxOpticalPower:-2.41dBm'|grep-Po'[-0-9.]+'#取出d前面数字#为最小匹配echo'["mem",ok],["hardware",false],["filesystem",false]'|grep-Po'[^"]+(=",false)'#取出false前面的字母echo'["mem",ok],["hardware",false],["filesystem",false]'|grep-Po'\w+",false'|grep-Po'^\w+'#取出false前面的字母grep用于if判断{ ifechoabc|grep"a">/dev/null2>&1thenecho"abc"elseecho"null"fi }tr{-c#用字符串1中字符集的补集替换此字符集,要求字符集为ASCII-d#删除字符串1中所有输入字符-s#删除所有重复出现字符序列,只保留第一个:即将重复出现字符串压缩为一个字符串[a-z]#a-z内的字符组成的字符串[A-Z]#A-Z内的字符组成的字符串[0-9]#数字串\octal#一个三位的八进制数,对应有效的ASCII字符[O*n]#表示字符O重复出现指定次数n。因此[O*2]匹配OO的字符串 tr中特定控制字符表达方式{ \aCtrl-G\007#铃声\bCtrl-H\010#退格符\fCtrl-L\014#走行换页\nCtrl-J\012#新行\rCtrl-M\015#回车\tCtrl-I\011#tab键\vCtrl-X\030 trA-Za-z#将所有大写转换成小写字母tr"""\n"#将空格替换为换行tr-s"[\012]" }seq{ #不指定起始数值,则默认为1-s#选项主要改变输出的分格符,预设是\n-w#等位补全,就是宽度相等,不足的前面补0-f#格式化输出,就是指定打印的格式 seq10100#列出10-100seq110|tac#倒叙列出seq-s'+'90100|bc#从90加到100seq-f'dir%g'110|xargsmkdir#创建dir1-10seq-f'dir%03g'110|xargsmkdir#创建dir001-010 trap{ awk{#默认是执行打印全部print$0#1为真打印$0#0为假不打印 -F#改变FS值(分隔符)~#域匹配==#变量匹配!~#匹配不包含=#赋值!=#不等于+=#叠加\b#退格\f#换页\n#换行\r#回车\t#制表符Tab\c#代表任一其他字符-F"[]+|[%]+"#多个空格或多个%为分隔符[a-z]+#多个小写字母[a-Z]#代表所有大小写字母(aAbB...zZ)[a-z]#代表所有大小写字母(ab...z)[:alnum:]#字母数字字符[:alpha:]#字母字符[:cntrl:]#控制字符[:digit:]#数字字符[:graph:]#非空白字符(非空格、控制字符等)[:lower:]#小写字母[:print:]#与[:graph:]相似,但是包含空格字符[:punct:]#标点字符[:space:]#所有的空白字符(换行符、空格、制表符)[:upper:]#大写字母[:xdigit:]#十六进制的数字(0-9a-fA-F)[[:digit:][:lower:]]#数字和小写字母(占一个字符) 内建变量{$n#当前记录的第n个字段,字段间由FS分隔$0#完整的输入记录ARGC#命令行参数的数目ARGIND#命令行中当前文件的位置(从0开始算)ARGV#包含命令行参数的数组CONVFMT#数字转换格式(默认值为%.6g)ENVIRON#环境变量关联数组ERRNO#最后一个系统错误的描述FIELDWIDTHS#字段宽度列表(用空格键分隔)FILENAME#当前文件名FNR#同NR,但相对于当前文件FS#字段分隔符(默认是任何空格)IGNORECASE#如果为真(即非0值),则进行忽略大小写的匹配NF#当前记录中的字段数(列)NR#当前行数OFMT#数字的输出格式(默认值是%.6g)OFS#输出字段分隔符(默认值是一个空格)ORS#输出记录分隔符(默认值是一个换行符)RLENGTH#由match函数所匹配的字符串的长度RS#记录分隔符(默认是一个换行符)RSTART#由match函数所匹配的字符串的第一个位置SUBSEP#数组下标分隔符(默认值是/034)BEGIN#先处理(可不加文件参数)END#结束时处理} 内置函数{gsub(r,s)#在整个$0中用s替代r相当于sed's///g'gsub(r,s,t)#在整个t中用s替代rindex(s,t)#返回s中字符串t的第一位置length(s)#返回s长度match(s,r)#测试s是否包含匹配r的字符串split(s,a,fs)#在fs上将s分成序列asprint(fmt,exp)#返回经fmt格式化后的expsub(r,s)#用$0中最左边最长的子串代替s相当于sed's///'substr(s,p)#返回字符串s中从p开始的后缀部分substr(s,p,n)#返回字符串s中从p开始长度为n的后缀部分} awk判断{awk'{print($1>$2)"第一排"$1:"第二排"$2}'#条件判断括号代表if语句判断""代表then":"代表elseawk'{max=($1>$2)$1:$2;printmax}'#条件判断如果$1大于$2,max值为为$1,否则为$2awk'{if($6>50)print$1"Toohigh";\elseprint"RangeisOK"}'fileawk'{if($6>50){count++;print$3}\else{x+5;print$2}}'file} 查看磁盘空间{df-h|awk-F"[]+|%"'$5>14{print$5}'df-h|awk'NR!=1{if(NF==6){print$5}elseif(NF==5){print$4}}'df-h|awk'NR!=1&&/%/{sub(/%/,"");print$(NF-1)}'df-h|sed'1d;//!N;s/\n//;s/\+//;'#将磁盘分区整理成一行可直接用df-P} 排列打印{awk'END{printf"%-10s%-10s\n%-10s%-10s\n%-10s%-10s\n","server","name","123","12345","234","1234"}'txtawk'BEGIN{printf"|%-10s|%-10s|\n|%-10s|%-10s|\n|%-10s|%-10s|\n","server","name","123","12345","234","1234"}'awk'BEGIN{print"***开始***";print"+-----------------+";printf"|%-5s|%-5s|%-5s|\n","id","name","ip";}$1!=1&&NF==4{printf"|%-5s|%-5s|%-5s|\n",$1,$2,$3""$11}END{print"+-----------------+";print"***结束***"}'txt} 老男孩awk经典题{分析图片服务日志,把日志(每个图片访问次数*图片大小的总和)排行,也就是计算每个url的总访问大小说明:本题生产环境应用:这个功能可以用于IDC网站流量带宽很高,然后通过分析服务器日志哪些元素占用流量过大,进而进行优化或裁剪该图片,压缩js等措施。本题需要输出三个指标:【被访问次数】【访问次数*单个被访问文件大小】【文件名(带URL)】测试数据59.33.26.105--[08/Dec/2010:15:43:56+0800]"GET/static/images/photos/2.jpgHTTP/1.1"20011299 awk'{array_num[$7]++;array_size[$7]+=$10}END{for(iinarray_num){printarray_num[i]""array_size[i]""i}}'} awk练习题{ wang4cui3zhao4liu3liu3chang5li2 1通过第一个域找出字符长度为4的2当第二列值大于3时,创建空白文件,文件名为当前行第一个域$1(touch$1)3将文档中liu字符串替换为hong4求第二列的和5求第二列的平均值6求第二列中的最大值7将第一列过滤重复后,列出每一项,每一项的出现次数,每一项的大小总和 1、字符串长度awk'length($1)=="4"{print$1}'2、执行系统命令awk'{if($2>3){system("touch"$1)}}'3、gsub(/r/,"s",域)在指定域(默认$0)中用s替代r(sed's///g')awk'{gsub(/liu/,"hong",$1);print$0}'a.txt4、列求和awk'{a+=$2}END{printa}'5、列求平均值awk'{a+=$2}END{printa/NR}'awk'{a+=$2;b++}END{printa,a/b}'6、列求最大值awk'BEGIN{a=0}{if($2>a)a=$2}END{printa}'7、将第一列过滤重复列出每一项,每一项的出现次数,每一项的大小总和awk'{a[$1]++;b[$1]+=$2}END{for(iina){printi,a[i],b[i]}}'} awk处理复杂日志{6.19:DHB_014_号百总机服务业务日报:广州到达数异常!DHB_023_号百漏话提醒日报:珠海到达数异常!6.20:DHB_014_号百总机服务业务日报:广州到达数异常!到 awk-F'[_:]+''NF>2{print$4,$1"_"$2,b|"sort";next}{b=$1}'#当前行NF小于等于2只针对{print$4,$1"_"$2,b|"sort";next}有效即6.19:行跳过此操作,{b=$1}仍然执行#当前行NF大于2执行到next强制跳过本行,即跳过后面的{b=$1} 广州DHB_0146.19}} b#跳过匹配的行p#打印d#删除s#替换g#配合s全部替换i#行前插入a#行后插入r#读y#转换q#退出 代表查找的串内容*#任意多个前驱字符(前导符)#0或1个最小匹配没加-r参数需转义\$#最后一行.*#匹配任意多个字符\(a\)#保存a作为标签1(\1) 模式空间{ #模式空间(两行两行处理)模式匹配的范围,一般而言,模式空间是输入文本中某一行,但是可以通过使用N函数把多于一行读入模式空间#暂存空间里默认存储一个空行n#读入下一行(覆盖上一行)h#把模式空间里的行拷贝到暂存空间H#把模式空间里的行追加到暂存空间g#用暂存空间的内容替换模式空间的行G#把暂存空间的内容追加到模式空间的行后x#将暂存空间的内容于模式空间里的当前行互换!#对其前面的要匹配的范围取反D#删除当前模式空间中直到并包含第一个换行符的所有字符(/.*/匹配模式空间中所有内容,匹配到就执行D,没匹配到就结束D)N#追加下一个输入行到模式空间后面并在第二者间嵌入一个换行符,改变当前行号码,模式匹配可以延伸跨域这个内嵌换行p#打印模式空间中的直到并包含第一个换行的所有字符 标签函数{ :lable#建立命令标记,配合b,t函数使用跳转blable#分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。tlabe#判断分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令出,或者到脚本末尾。与b函数不同在于t在执行跳转前会先检查其前一个替换命令是否成功,如成功,则执行跳转。 sed-e'{:p1;/A/s/A/AA/;/B/s/B/BB/;/[AB]\{10\}/b;bp1;}'#文件内容第一行A第二行B:建立标签p1;两个替换函数(A替换成AA,B替换成BB)当A或者B达到10个以后调用b,返回echo'sdff[abccdddeee]'|sed':n;s#\(\[[^]*\)*#\1#;tn'#标签函数t使用方法,替换[]里的空格echo"198723124.03"|sed-r':a;s/([0-9]+)([0-9]{3})/\1,\2/;ta'#每三个字符加一个逗号 引用外部变量{ sed-n''$a',10p'sed-n""$a",10p" 修改keepalive配置剔除后端服务器{ sed-i'/real_server.*10.0.1.158.*8888/,+8s/^/#/'keepalived.confsed-i'/real_server.*10.0.1.158.*8888/,+8s/^#//'keepalived.conf }模仿rev功能{ echo123|sed'/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//;'/\n/!G;#没有\n换行符,要执行G,因为保留空间中为空,所以在模式空间追加一空行s/\(.\)\(.*\n\)/&\2\1/;#标签替换&\n23\n1$(关键在于&,可以让后面//匹配到空行)//D;#D命令会引起循环删除模式空间中的第一部分,如果删除后,模式空间中还有剩余行,则返回D之前的命令,重新执行,如果D后,模式空间中没有任何内容,则将退出。//D匹配空行执行D,如果上句s没有匹配到,//也无法匹配到空行,"//D;"命令结束s/.//;#D结束后,删除开头的\n xargs{#命令替换-t先打印命令,然后再执行-i用每项替换{}find/-perm+7000|xargsls-l#将前面的内容,作为后面命令的参数seq110|xargs-idate-d"{}days"+%Y-%m-%d#列出10天日期 dialog菜单{#默认将所有输出用stderr输出,不显示到屏幕使用参数--stdout可将选择赋给变量#退出状态0正确1错误 窗体类型{--calendar#日历--checklist#允许你显示一个选项列表,每个选项都可以被单独的选择(复选框)--form#表单,允许您建立一个带标签的文本字段,并要求填写--fselect#提供一个路径,让你选择浏览的文件--gauge#显示一个表,呈现出完成的百分比,就是显示出进度条。--infobox#显示消息后,(没有等待响应)对话框立刻返回,但不清除屏幕(信息框)--inputbox#让用户输入文本(输入框)--inputmenu#提供一个可供用户编辑的菜单(可编辑的菜单框)--menu#显示一个列表供用户选择(菜单框)--msgbox(message)#显示一条消息,并要求用户选择一个确定按钮(消息框)--password#密码框,显示一个输入框,它隐藏文本--pause#显示一个表格用来显示一个指定的暂停期的状态--radiolist#提供一个菜单项目组,但是只有一个项目,可以选择(单选框)--tailbox#在一个滚动窗口文件中使用tail命令来显示文本--tailboxbg#跟tailbox类似,但是在background模式下操作--textbox#在带有滚动条的文本框中显示文件的内容(文本框)--timebox#提供一个窗口,选择小时,分钟,秒--yesno(yes/no)#提供一个带有yes和no按钮的简单信息框} select菜单{ #输入项不在菜单自动会提示重新输入selectmenuiteminpick1pick2pick3退出doecho$menuitemcase$menuitemin退出)exit;;*)selectareainarea1area2area3返回doecho$areacase$areain返回)break;;*)echo"对$area操作";;esacdone;;esacdone shift{ ./cs.sh123#!/bin/shuntil[$#-eq0]doecho"第一个参数为:$1参数个数为:$#"#shift命令执行前变量$1的值在shift命令执行后不可用shiftdone }getopts给脚本加参数{ #!/bin/shwhilegetopts:ab:namedocase$nameina)aflag=1;;b)bflag=1bval=$OPTARG;;\)echo"USAGE:`basename$0`[-a][-bvalue]"exit1;;esacdoneif[!-z$aflag];thenecho"option-aspecified"echo"$aflag"echo"$OPTIND"fiif[!-z$bflag];thenecho"option-bspecified"echo"$bflag"echo"$bval"echo"$OPTIND"fiecho"here$OPTIND"shift$(($OPTIND-1))echo"$OPTIND"echo"`shift$(($OPTIND-1))`" tclsh{ expect交互{ exp_continue#多个spawn命令时并行interact#执行完成后保持交互状态,把控制权交给控制台expect"password:"#判断关键字符send"passwd\r"#执行交互动作,与手工输入密码的动作等效。字符串结尾加"\r" ssh后sudo{ #!/bin/bash#sudo注释下行允许后台运行#Defaultsrequiretty#sudo去掉!允许远程#Defaults!visiblepw /usr/bin/expect-c'settimeout5spawnssh-oStrictHostKeyChecking=noxuesong1@192.168.42.128"sudogrepxuesong1/etc/passwd"expect{"passphrase"{send_user"sshkey\n"send"xuesong\r";expect{"sudo"{send_user"sudo\n"send"xuesong\r"interact}eof{send_user"sudoeof\n"}}}"password:"{send_user"ssh\n"send"xuesong\r";expect{"sudo"{send_user"sudo\n"send"xuesong\r"interact}eof{send_user"sudoeof\n"}}}"sudo"{send_user"sudo\n"send"xuesong\r"interact}eof{send_user"ssheof\n"}}' 交互双引号引用较长变量{#!/bin/bashRemoteUser=xuesong12Ip=192.168.1.2RemotePasswd=xuesongCmd="/bin/echo"$PubKey">"$RemoteKey"/authorized_keys" /usr/bin/expect-c"settimeout10spawnssh-oStrictHostKeyChecking=no$RemoteUser@$Ip{$Cmd};expect{password:{send_userRemotePasswd\nsend${RemotePasswd}\r;interact;}eof{send_usereof\n}}" telnet交互{#!/bin/bashIp="10.0.1.53"a="\{\'method\'\:\'doLogin\'\,\'params\'\:\{\'uName\'\:\'bobbietest\'\}"/usr/bin/expect-c"settimeout15spawntelnet${Ip}8000expect"Escape"send"${a}\\r"expect{-re"\"err.*none\""{exit0}timeout{exit1}eof{exit2}}"echo$ #!/bin/bashIp='192.168.1.6'#循环就行RemoteUser='user'#普通用户RemotePasswd='userpasswd'#普通用户的密码RemoteRootPasswd='rootpasswd'/usr/bin/expect-c"settimeout-1spawnssh-t-p$Port-oStrictHostKeyChecking=no$RemoteUser@$Ipexpect{password{send_userRemotePasswdsend${RemotePasswd}\r;expect{\"doesnotexist\"{send_user\"rootuserdoesnotexist\n\"exit10}password{send_user\"userpasswderror\n\"exit5}Last{send\"su-batch\n\"expect{Password{send_userRemoteRootPasswdsend${RemoteRootPasswd}\r;expect{\"]#\"{send\"sh/tmp/update.shupdate\n\"expect{\"]#\"{send_user${Ip}_Update_Done\n}eof}}}}}}}}\"Noroutetohost\"{send_user\"hostnotfound\n\"exit4}\"Invalidargument\"{send_user\"incorrectparameter\n\"exit8}\"Connectionrefused\"{send_user\"invalidportparameters\n\"exit9}\"doesnotexist\"{send_user\"rootuserdoesnotexist\"exit10}timeout{send_user\"connectiontimeout\n\"exit3}eof}"state=`echo$` 9实例{ 从1叠加到100{ echo$[$(echo+{1..100})]echo$[(100+1)*(100/2)]seq-s'+'100|bc 判断参数是否为空-空退出并打印null{ #!/bin/shecho$1name=${1:"null"}echo$name 循环数组{ for((i=0;i<${#o[*]};i++))doecho${o[$i]}done 判断路径{ if[-d/root/Desktop/text/123];thenecho"找到了123"if[-d/root/Desktop/text]thenecho"找到了text"elseecho"没找到text"fielseecho"没找到123文件夹"fi 找出出现次数最多{ awk'{print$1}'file|sort|uniq-c|sort-k1r }判断脚本参数是否正确{ ./test.sh-p123-P3306-h127.0.0.1-uroot#!/bin/shif[$#-ne8];thenecho"USAGE:$0-uuser-ppasswd-Pport-hhost"exit1fi whilegetopts:u:p:P:h:namedocase$nameinu)mysql_user=$OPTARG;;p)mysql_passwd=$OPTARG;;P)mysql_port=$OPTARG;;h)mysql_host=$OPTARG;;*)echo"USAGE:$0-uuser-ppasswd-Pport-hhost"exit1;;esacdone if[-z$mysql_user]||[-z$mysql_passwd]||[-z$mysql_port]||[-z$mysql_host]thenecho"USAGE:$0-uuser-ppasswd-Pport-hhost"exit1fi echo$mysql_user$mysql_passwd$mysql_port$mysql_host#结果root1233306127.0.0.1} #!/bin/shclearawk'BEGIN{print"+--------------------+--------------------+";printf"|%-20s|%-20s|\n","Name","Number";print"+--------------------+--------------------+";}'a=`grep"^[A-Z]"a.txt|sort+1-n|awk'{print$1":"$2}'`#cata.txt|sort+1-n|whilereadlistforlistin$adoname=`echo$list|awk-F:'{print$1}'`number=`echo$list|awk-F:'{print$2}'`awk'BEGIN{printf"|%-20s|%-20s|\n","'"$name"'","'"$number"'";print"+--------------------+--------------------+";}'doneawk'BEGIN{print"***TheEnd***"print""}' }判断日期是否合法{ #!/bin/shwhilereadadoifecho$a|grep-q"-"&&date-d$a+%Y%m%d>/dev/null2>&1thenifecho$a|grep-e'^[0-9]\{4\}-[01][0-9]-[0-3][0-9]$'thenbreakelseecho"您输入的日期不合法,请从新输入!"fielseecho"您输入的日期不合法,请从新输入!"fidoneecho"日期为$a" }打印日期段所有日期{ #!/bin/bashqsrq=20010101jsrq=20010227n=0>tmpwhile:;docurrent=$(date+%Y%m%d-d"$nday$qsrq")if[[$current==$jsrq]];thenecho$current>>tmp;breakelseecho$current>>tmp((n++))fidonerq=`awk'NR==1{print}'tmp` }打印提示{ cat< 登陆远程执行命令{ #特殊符号需要\转义sshroot@ip< 数学计算的小算法{ #!/bin/shA=1B=1while[$A-le10]doSUM=`expr$A\*$B`echo"$SUM"if[$A=10]thenB=`expr$B+1`A=1fiA=`expr$A+1`done 多行合并{ sed'{N;s/\n//}'file#将两行合并一行(去掉换行符)awk'{printf(NR%2!=0)$0"":$0"\n"}'#将两行合并一行awk'{printf"%s",$0}'#将所有行合并awk'{if(NR%4==0){print$0}else{printf"%s",$0}}'file#将4行合并为一行(可扩展) }横竖转换{ cata.txt|xargs#列转行cata.txt|xargs-n1#行转列 竖行转横行{ catfile|tr'\n'''echo$(catfile)#!/bin/shforiin`catfile`doa=${a}""${i}doneecho$a 取用户的根目录{ #!/bin/bashwhilereadnamepassuidgidgecoshomeshelldoecho$homedone 远程打包{ssh-n$ip'find'$path'/data/opt-typef-name"*.sh"-or-name"*.py"-or-name"*.pl"|xargstarzcvpf/tmp/data_backup.tar.gz'} 把汉字转成encode格式{ echo论坛|tr-d"\n"|xxd-i|sed-e"s/0x/%/g"|tr-d",\n"%c2%db%cc%b3echo论坛|tr-d"\n"|xxd-i|sed-e"s/0x/%/g"|tr-d",\n"|tr"[a-f]""[A-F]"#大写的%C2%DB%CC%B3 把目录带有大写字母的文件名改为全部小写{ #!/bin/bashforfin*;domv$f`echo$f|tr"[A-Z]""[a-z]"`done 查找连续多行,在不连续的行前插入{ #/bin/bashlastrow=nulli=0catincl|whilereadlinedoi=`expr$i+1`ifecho"$lastrow"|grep"#include<[A-Z].h>"thenifecho"$line"|grep-v"#include<[A-Z].h>"thensed-i''$i'i\\/\/Allheaderfilesareinclude'incli=`expr$i+1`fifilastrow="$line"done 查询数据库其它引擎{ #/bin/bashpath1=/data/mysql/data/dbpasswd=db123#MyISAM或InnoDBengine=InnoDB if[-d$path1];then dir=`ls-p$path1|awk'/\/$/'|awk-F'/''{print$1}'`fordbin$dirdonumber=`mysql-uroot-p$dbpasswd-A-S"$path1"mysql.sock-e"use${db};showtablestatus;"|grep-c$engine`if[$number-ne0];thenecho"${db}"fidonefi 批量修改数据库引擎{#/bin/bashfordbintesttest1test3dotables=`mysql-uroot-pdb123-A-S/data/mysql/data/mysql.sock-e"use$db;showtables;"|awk'NR!=1{print}'` fortablein$tablesdomysql-uroot-pdb123-A-S/data/mysql/data/mysql.sock-e"use$db;altertable$tableengine=MyISAM;"donedone} 将shell取到的数据插入mysql数据库{mysql-u$username-p$passwd-h$dbhost-P$dbport-A-e"use$dbname;insertintodatavalues('','$ip','$date','$time','$data')" 两日期间隔天数{D1=`date-d'20070409'+"%s"`D2=`date-d'20070304'+"%s"`D3=$(($D1-$D2))echo$(($D3/60/60/24))} while执行ssh只循环一次{cat-#让cat读连接文件stdin的信息seq10|whilereadline;dosshlocalhost"cat-";done#显示的9次是被ssh吃掉的seq10|whilereadline;dossh-nlocalhost"cat-";done#ssh加上-n参数可避免只循环一次} ssh批量执行命令{ #版本1#!/bin/bashwhilereadlinedoIp=`echo$line|awk'{print$1}'`Passwd=`echo$line|awk'{print$2}'`ssh-nlocalhost"cat-"sshpass-p"$Passwd"ssh-n-t-oStrictHostKeyChecking=noroot@$Ip"id"done #版本2#!/bin/bashIplist=`awk'{print$1}'iplist.txt`forIpin$IplistdoPasswd=`awk'/'$Ip'/{print$2}'iplist.txt`sshpass-p"$Passwd"ssh-n-t-oStrictHostKeyChecking=noroot@$Ip"id"done 在同一位置打印字符{ #!/bin/bashecho-ne"\t"foriin`seq-w100-11`doecho-ne"$i\b\b\b";#关键\b退格sleep1;done 多进程后台并发简易控制{ #!/bin/bashtest(){echo$asleep5}forain`seq130`dotest&echo$!((num++))if[$num-eq6];thenecho"wait..."waitnum=0fidonewait shell并发{ #!/bin/bashtmpfile=$$.fifo#创建管道名称mkfifo$tmpfile#创建管道exec4<>$tmpfile#创建文件标示4,以读写方式操作管道$tmpfilerm$tmpfile#将创建的管道文件清除thred=4#指定并发个数seq=(12345678921222324253132333435)#创建任务列表 #为并发线程创建相应个数的占位{for((i=1;i<=${thred};i++))doecho;#因为read命令一次读取一行,一个echo默认输出一个换行符,所以为每个线程输出一个占位换行done}>&4#将占位信息写入管道 foridin${seq}#从任务列表seq中按次序获取每一个任务doread#读取一行,即fd4中的一个占位符(./ur_command${id};echo>&4)在后台执行任务ur_command并将任务${id}赋给当前任务;任务执行完后在fd4种写入一个占位符done<&4#指定fd4为整个for的标准输入wait#等待所有在此shell脚本中启动的后台任务完成exec4>&-#关闭管道#!/bin/bash FifoFile="$$.fifo"mkfifo$FifoFileexec6<>$FifoFilerm$FifoFilefor((i=0;i<=20;i++));doecho;done>&6 shell并发函数{functionConCurrentCmd(){#进程数Thread=30 #列表文件CurFileName=iplist.txt #定义fifo文件FifoFile="$$.fifo" #新建一个fifo类型的文件mkfifo$FifoFile #将fd6与此fifo类型文件以读写的方式连接起来exec6<>$FifoFilerm$FifoFile #事实上就是在文件描述符6中放置了$Thread个回车符for((i=0;i<=$Thread;i++));doecho;done>&6 #此后标准输入将来自fd5exec5<$CurFileName #开始循环读取文件列表中的行Count=0whileread-u5linedoread-u6letCount+=1#此处定义一个子进程放到后台执行#一个read-u6命令执行一次,就从fd6中减去一个回车符,然后向下执行#fd6中没有回车符的时候,就停在这了,从而实现了进程数量控制{echo$Count#这段代码框就是执行具体的操作了function echo>&6#当进程结束以后,再向fd6中追加一个回车符,即补上了read-u6减去的那个}&done #等待所有后台子进程结束wait #关闭fd6exec6>&- #关闭fd5exec5>&-}并发例子{#!/bin/bash 函数{ ip(){echo"a1"|awk'$1=="'"$1"'"{print$2}'}web=aip$web 检测软件包是否存在{ rpm-qdialog>/dev/nullif["$"-ge1];thenecho"installdialog,Pleasewait..."yum-yinstalldialogrpm-qdialog>/dev/null[$-ge1]&&echo"dialoginstallationfailure,exit"&&exitecho"dialogdone"readfi 游戏维护菜单-修改配置文件{#!/bin/bash conf=serverlist.xmlAreaList=`awk-F'"''/ selectareain$AreaList全部退出doecho""echo$areacase$areain退出)exit;;*)selectoperatein"修改版本号""添加维护中""删除维护中""返回菜单"doecho""echo$operatecase$operatein修改版本号)echo请输入版本号whilereadversiondoifecho$version|grep-w10[12][0-9][0-9][0-9][0-9][0-9][0-9]thenbreakfiecho请从新输入正确的版本号donecase$areain全部)case$versionin101*)echo"请确认操作对$area体验区$operate"readsed-i's/101[0-9][0-9][0-9][0-9][0-9][0-9]/'$version'/'$conf;;102*)echo"请确认操作对$area正式区$operate"readsed-i's/102[0-9][0-9][0-9][0-9][0-9][0-9]/'$version'/'$conf;;esac;;*)type=`awk-F'"''/'$area'/{print$14}'$conf|cut-c1-3`readtype=`echo$version|cut-c1-3`if[$type!=$readtype]thenecho"版本号不对应,请从新操作"continuefiecho"请确认操作对$area区$operate"read awk-F'"''/'$area'/{print$12}'$conf|xargs-ised-i'/'{}'/s/10[12][0-9][0-9][0-9][0-9][0-9][0-9]/'$version'/'$conf;;esac;;添加维护中)case$areain全部)echo"请确认操作对$area区$operate"readawk-F'"''/ keepalive剔除后端服务{ #!/bin/bash#行数请自定义,默认8行if[X$2==X];thenecho"error:IPnull"readexitficase$1indel)sed-i'/real_server.*'$2'.*8888/,+8s/^/#/'/etc/keepalived/keepalived.conf/etc/init.d/keepalivedreload;;add)sed-i'/real_server.*'$2'.*8888/,+8s/^#//'/etc/keepalived/keepalived.conf/etc/init.d/keepalivedreload;;*)echo"Parametererror";;esac} 申诉中国反垃圾邮件联盟黑名单{ #!/bin/bash IpList=`awk'$1!~"^#"&&$1!=""{print$1}'host.list` CONTENT='我们是一家正规的XXX。xxxxxxx。恳请将我们的发送服务器IP移出黑名单。谢谢!处理措施:1.XXXX。2.XXXX。'CORP='abc.com'WWW='www.abc.cm'NAME='def'MAIL='def@163.com.cn'TEL='010-50000000'LEVEL='0' forIpin$IpListdoStatus=`curl-d"IP=$Ip"$QueryAdd|grep'Getout/ShowFormIP='|grep-wc'申诉脱离'`if[$Status-ge1];thenIpStatus="黑名单中"results=`curl-d"IP=${Ip}&CONTENT=${CONTENT}&CORP=${CORP}&WWW=${WWW}&NAME=${NAME}&MAIL=${MAIL}&TEL=${TEL}&LEVEL=${LEVEL}"$ComplaintAdd|grep-E'您的黑名单脱离申请已提交|该IP的脱离申请已被他人提交|申请由于近期内有被拒绝的记录'`echo$resultsifecho$results|grep'您的黑名单脱离申请已提交'>/dev/null2>&1thencomplaint='申诉成功'elifecho$results|grep'该IP的脱离申请已被他人提交'>/dev/null2>&1thencomplaint='申诉重复'elifecho$results|grep'申请由于近期内有被拒绝的记录'>/dev/null2>&1thencomplaint='申诉拒绝'elsecomplaint='异常'fielseIpStatus='正常'complaint='无需申诉'fiecho"$Ip$IpStatus$complaint">>$(date+%Y%m%d_%H%M%S).logdone functionBye(){tmp="\ ScriptTerminated...\"returntmp} functionRunApp(app){if(app=="xterm"){system("xterm&");return}if(app=="xcalc"){system("xcalc&");return}if(app=="xload"){system("xload&");return}if(app=="exit"){x=0}}