运维常用linux命令\shell技巧范例 --------雪松整理
Q群: 198173206 欢迎linux系统运维朋友加入!
错误在所难免,还望指正!
================================== 1文件管理 2软件管理 3系统管理 4服务管理 5网络管理 6磁盘管理 7用户管理 8脚本相关 ==================================
---------------------------------- 1文件管理 ----------------------------------
创建空白文件 touch
不提示删除非空目录 rm -rf 目录名 (-r:递归删除 -f强制)
##################################
恢复rm删除的文件(ext3) 查看磁盘分区格式 df -T
卸载挂载 umount /data/
ext3grep /dev/sdb1 --ls --inode 2 记录信息继续查找目录下文件inode信息 ext3grep /dev/sdb1 --ls --inode 131081 # 此处是inode 记录下inode信息开始恢复目录 ext3grep /dev/sdb1 --restore-inode 49153
##################################
windows文本转linux文本 dos2unix
linux文本转windows文本 unix2dos
转换编码 iconv -f gbk -t utf8 原.txt > 新.txt
查看md5值 md5sum
硬链接 ln
符号连接 ln -s
查看上下翻页且显示行号 cat ? | nl |less q退出
结束状态 ctrl+z
查看文件开头内容 head
查看文件结尾内容 tail -f # 监视日志文件
检查文件类型 file
重命名 rename rename source_pattern target_pattern source_files
更改默认权限 umask
按数字排序 sort -n
按数字倒叙 sort -nr
过滤重复行 sort -u
删除重复的行 uniq
重复的行出现次数 uniq -c
只显示不重复行 uniq -u
将两个文件合并用tab键分隔开 paste a b
将两个文件合并指定'+'符号隔开 paste -d'+' a b
将多行数据合并到一行用tab键隔开 paste -s a
设置隐藏属性 chattr [+-=] [ASacdistu] 文件或目录
给口令文件设置不可改变位 chattr +i /etc/passwd
向下分面器 more
搜索 locate 字符串
查看行数 wc -l
实时某个目录下查看最新改动过的文件 watch -d -n 1 'df; ls -FlAt /path'
快速备份一个文件 cp filename{,.bak}
##################################
配置编辑器 gconf-editor
vi 配置文件 vi /etc/vimrc
打开文件定位到24行 vi +24 /etc/passwd
vi加强版 vim
打开行号 :set nu
取消行号 :set nonu
跳转到200 200G
取消高亮 :nohl
设置自动缩进 :set autoindent
查看文本格式 set ff
改为unix格式 set binary
向前翻页 ctrl+ U
向后翻页 ctrl+ D
全部替换 g/字符1/s//字符2/g %s/字符1/字符2/g # 普通用户打开文档不能保存 # tee是一个把stdin保存到文件的小工具,而%,是vim当中一个只读寄存器的名字,总保存着当前编辑文件的文件路径 :w !sudo tee %
##################################
按文件名查找 find /etc -name http
查找某一类型文件 find . -type f
按照文件权限查找 find / -perm
按照文件属主查找 find / -user
按照文件所属的组来查找文件 find / -group
文件使用时间在N天以内 find / -atime -n
文件使用时间在N天以前 find / -atime +n
文件内容改变时间在N天以内 find / -mtime -n
文件内容改变时间在N天以前 find / -mtime +n
文件状态改变时间在N天前 find / -ctime +n
文件状态改变时间在N天内 find / -ctime -n
# linux文件无创建时间 # Access 使用时间 # Modify 内容修改时间 # Change 状态改变时间(权限、属主)
查找文件长度大于1M字节的文件 find / -size +1000000c -print
按名字查找文件传递给-exec后命令 find /etc -name "passwd*" -exec grep "xuesong" {} \;
查找文件名,不取路径 find . -name 't*' -exec basename {} \;
##################################
====================================================================
---------------------------------- 2软件管理 ----------------------------------
解包tar tar xvf 1.tar -C 目录
打包tar tar -cvf 1.tar *
查看tar tar tvf 1.tar
给tar追加文件 tar -rvf 1.tar 文件名
解包gz tar zxvpf gz.tar.gz -C 放到指定目录 包中的目录
打包gz tar zcvpf gz.tar.gz
查看gz tar ztvpf gz.tar.gz
解压bzip2 bzip2 -dv 1.tar.bz2
解压gzip到tar gzip -dv 1.tar.gz
压缩tar到gz gzip -v 1.tar
bzip2压缩 bzip2 -v 1.tar
查看bzip2 bzcat
rpm安装 rpm -ivh
卸载 rpm -e lynx
强制卸载 rpm -e lynx --nodeps
测试 rpm --test lynx
查看所有安装的rpm包 rpm -qa
查找包是否安装 rpm -qa | grep http
升级包 rpm -Uvh
解压zip unzip zip.zip
压缩zip zip zip.zip *
rar3.6下载地址 http://www./rar/rarlinux-3.6.0.tar.gz
压缩文件为rar包 rar a rar.rar *.jpg
解压rar包 unrar x rar.rar
7z压缩 7z a 7z.7z *
7z解压 7z e 7z.7z
查看字符行 zgrep 字符 1.gz
打包/home, /etc ,但排除 /home/dmtsai tar --exclude /home/dmtsai -zcvf myfile.tar.gz /home/* /etc
在 /home 当中,比 2005/06/01 新的文件才备份 tar -N "2005/06/01" -zcvf home.tar.gz /home
下载 wgetrc
文本上网 lynx
制作镜像 cp -v /dev/dvd /software/rhel4.6.iso9660
清除编译结果 make clean
源码安装 ./configure --help |less ./configure --prefix=/usr/local/ make make install
perl程序编译 perl Makefile.PL make make test make install
perl程序编译 python file.py
编译c程序 gcc -g hello.c -o hello
====================================================================
---------------------------------- 3系统管理 ----------------------------------
终端锁屏 Ctrl+S
解锁屏 Ctrl+Q
PS1环境变量控制提示显示 PS1='[\u@ \H \w \A \@#]\$'
开机启动模式(3为多用户命令) vi /etc/inittab 禁止 ctrl + alt + del 关闭计算机 #ca::ctrlaltdel:/sbin/shutdown -t3 -r now
查找命令的目录 whereis
查看当前要执行的命令所在的路径 which
让部命令后台运行 命令 &
将前台放入后台(暂停) ctrl+z
查看后台运行程序 jobs
启动后台暂停进程 bg 2
调回后台进程 fg 2
后台运行不受shell退出影响 nohup cmd &
清空整个屏幕 clear
重新初始化屏幕 reset
查询用过的命令默认1000条 history
清楚记录命令 history -c cat /root/.bash_history
查看登陆过的用户信息 last last -n user who /var/log/wtmp
列出登录系统失败的用户相关信息 lastb -a /var/log/btmp
防火墙日志 tail -f /var/log/messages
ssh日志 tail -f /var/log/secure
随机生成密码 mkpasswd -l位数 -C大小 -c小写 -d数字 -s特殊字符 mkpasswd -l 8 -C 2 -c 2 -d 4 -s 0
当前在线用户 who w
查看当前用户名 whoami
查看登陆用户名 logname
显示月历 cal
查看服务器启动时间 uptime
设日期 date -s 20091112
设时间 date -s 18:30:50
同步时间 /usr/sbin/ntpdate stdtime.gov.hk
7天前日期 `date -d "7 days ago" +%Y%m%d`
日期格式转换 `date +%Y-%m-%d -d '20110902'`
日期和时间 date +%Y-%m-%d_%X
查看时间 hwclock
账户影子文件 /etc/shadow
列出所有语系 locale -a
修改语言 LANG=en
修改编码 vi /etc/sysconfig/i18n utf-8 <---> GBK
强制字符集 export LC_ALL=C
查询静态主机名 vi /etc/hosts
最大连接 /etc/security/limits.conf
grub开机启动项添加 /etc/grub.conf title ms-dos rootnoverify (hd0,0) chainloader +1
别名 alias
监测命令 watch
查看Linux版本信息 uname -a cat /proc/version cat /etc/issue lsb_release -a
查看cpu信息 more /proc/cpuinfo
查看cpu型号和逻辑核心数 cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
cpu运行的位数 getconf LONG_BIT
物理cpu个数 cat /proc/cpuinfo | grep physical | uniq -c
结果大于0支持64位 cat /proc/cpuinfo | grep flags | grep ' lm ' | wc -l
查看cpu是否支持虚拟化 cat /proc/cpuinfo|grep flags pae支持半虚拟化 Intel VT 支持全虚拟化
查看内存信息 more /proc/meminfo
查看全面硬件信息 dmidecode
查看服务器型号 dmidecode | grep "Product Name"
查看软raid信息 cat /proc/mdstat
查看硬raid信息 cat /proc/scsi/scsi
查看硬件信息 lspci
查看是否支持raid lspci|grep RAID
显示开机信息 dmesg
进程树 pstree
每隔一秒报告虚拟内存统计信息9次 vmstat 1 9
把180号进程的优先级加1 renice +1 180
终止某个PID进程 kill -9 PID
指定三天后下午5:00执行/bin/ls at 5pm + 3 days /bin/ls
编辑周期任务 crontab -e 分钟 小时 天 月 星期 命令或脚本 01 1-3/2 * * * 命令或脚本
直接将命令写入周期任务 echo "40 7 * * 2 /root/sh">>/var/spool/cron/root
查看自动周期性任务 crontab -l
删除自动周期性任务 crontab -r
禁止或允许用户使用周期任务 cron.deny和cron.allow
启动自动周期性服务 service crond 启动|停止|重启|状态>
是否打开了某个端口 netstat -anlp | grep 端口号
sudo命令权限添加 visudo 用户 别名(可用all)=NOPASSWD:命令1,命令2 wangming linuxfan=NOPASSWD:/sbin/apache start,/sbin/apache restart UserName ALL=(ALL) ALL
制作补丁 diff suzu.c suzu2.c > sz.patch
安装补丁 patch suzu.c < sz.patch
显示打开指定文件的所有进程 lsof 文件
查看端口的进程 lsof -i :32768
显示消耗内存最多的10个运行中的进程,以内存使用量排序.cpu +3 ps aux |grep -v USER | sort -nk +4 | tail
查看内核模块 lsmod
yum扩展源 http://download./pub/epel wget http://download./pub/epel/5/i386/epel-release-5-4.noarch.rpm rpm -Uvh epel-release-5-4.noarch.rpm
升级所有包版本,依赖关系,系统版本内核都升级 yum -y update
升级指定的软件包 yum -y update 软件包名
不改变软件设置更新软件,系统版本升级,内核不改变 yum -y upgrade
yum搜索相关包 yum search mail
会改变配置文件,改变旧的依赖关系,改变系统版本 dist-upgrade
编辑启动项 /boot/grub/grub.conf
开机启动脚本顺序 /etc/profile /etc/profile.d/*.sb ~/bash_profile ~/.bashrc /etc/bashrc
使TCP SYN Cookie 保护生效 # "SYN Attack"是一种拒绝服务的攻击方式 echo 1 > /proc/sys/net/ipv4/tcp_syncookies
--------------------------------------------------------------------
top
前五行是系统整体的统计信息。 第一行是任务队列信息,同 uptime 命令的执行结果。其内容如下: 01:06:48 当前时间 up 1:22 系统运行时间,格式为时:分 1 user 当前登录用户数 load average: 0.06, 0.60, 0.48 系统负载,即任务队列的平均长度。 三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。
第二、三行为进程和CPU的信息。当有多个CPU时,这些内容可能会超过两行。内容如下: Tasks: 29 total 进程总数 1 running 正在运行的进程数 28 sleeping 睡眠的进程数 0 stopped 停止的进程数 0 zombie 僵尸进程数 Cpu(s): 0.3% us 用户空间占用CPU百分比 1.0% sy 内核空间占用CPU百分比 0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比 98.7% id 空闲CPU百分比 0.0% wa 等待输入输出的CPU时间百分比 0.0% hi 0.0% si
最后两行为内存信息。内容如下:
Mem: 191272k total 物理内存总量 173656k used 使用的物理内存总量 17616k free 空闲内存总量 22052k buffers 用作内核缓存的内存量 Swap: 192772k total 交换区总量 0k used 使用的交换区总量 192772k free 空闲交换区总量 123988k cached 缓冲的交换区总量。 内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖, 该数值即为这些内容已存在于内存中的交换区的大小。 相应的内存再次被换出时可不必再对交换区写入。
进程信息区 统计信息区域的下方显示了各个进程的详细信息。首先来认识一下各列的含义。
序号 列名 含义 a PID 进程id b PPID 父进程id c RUSER Real user name d UID 进程所有者的用户id e USER 进程所有者的用户名 f GROUP 进程所有者的组名 g TTY 启动进程的终端名。不是从终端启动的进程则显示为 ? h PR 优先级 i NI nice值。负值表示高优先级,正值表示低优先级 j P 最后使用的CPU,仅在多CPU环境下有意义 k %CPU 上次更新到现在的CPU时间占用百分比 l TIME 进程使用的CPU时间总计,单位秒 m TIME+ 进程使用的CPU时间总计,单位1/100秒 n %MEM 进程使用的物理内存百分比 o VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES p SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。 q RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA r CODE 可执行代码占用的物理内存大小,单位kb s DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb t SHR 共享内存大小,单位kb u nFLT 页面错误次数 v nDRT 最后一次写入到现在,被修改过的页面数。 w S 进程状态。 D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程 x COMMAND 命令名/命令行 y WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名 z Flags 任务标志,参考 sched.h ##################################
iptables 内建三个表:nat mangle 和 filter filter预设规则表,有INPUT、FORWARD 和 OUTPUT 三个规则链
INPUT 进入 FORWARD 转发 OUTPUT 出去 ACCEPT 将封包放行 REJECT 拦阻该封包 DROP 丢弃封包不予处理
-A 在所选择的链(INPUT等)末添加一条或更多规则 -D 删除一条 -E 修改 -p tcp、udp、icmp 0相当于所有all !取反 -P 设置缺省策略(与所有链都不匹配强制使用此策略) -s IP/掩码 (IP/24) 主机名、网络名和清楚的IP地址 !取反 -j 目标跳转,立即决定包的命运的专用内建目标 -i 进入的(网络)接口 [名称] eth0 -o 输出接口[名称] -m 模块 --sport 源端口 --dport 目标端口 #配置文件 vi /etc/sysconfig/iptables #将防火墙中的规则条目清除掉 iptables -F #注意:iptables -P INPUT ACCEPT #导入防火墙规则 iptables-restore <规则文件 #保存防火墙设置 /etc/init.d/iptables save #重启防火墙服务 /etc/init.d/iptables restart #查看规则 iptables -L -n iptables -L -n --line-numbers #从某个规则链中删除一条规则 iptables -D INPUT --dport 80 -j DROP iptables -D INPUT 8 #取代现行规则 iptables -R INPUT 8 -s 192.168.0.1 -j DROP #插入一条规则 iptables -I INPUT 8 --dport 80 -j ACCEPT #查看转发 iptables -t nat -nL #在内核里打开ip转发功能 echo 1 > /proc/sys/net/ipv4/ip_forward
##################################
#允许本地回环 iptables -A INPUT -s 127.0.0.1 -p tcp -j ACCEPT #允许已建立的或相关连的通行 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #开放对外访问 iptables -P OUTPUT ACCEPT #指定某端口针对IP开放 iptables -A INPUT -s 192.168.10.37 -p tcp --dport 22 -j ACCEPT #允许的IP或IP段访问 iptables -A INPUT -s 192.168.10.37 -p tcp -j ACCEPT #开放对外开放端口 iptables -A INPUT -p tcp --dport 80 -j ACCEPT #关闭入口 iptables -P INPUT DROP #关闭转发 iptables -P FORWARD DROP
##################################
iptables规则文件
# Generated by iptables-save v1.2.11 on Fri Feb 9 12:10:37 2007 *filter :INPUT DROP [637:58967] :FORWARD DROP [0:0] :OUTPUT ACCEPT [5091:1301533] #允许的IP或IP段访问 -A INPUT -s 127.0.0.1 -p tcp -j ACCEPT -A INPUT -s 192.168.0.0/255.255.0.0 -p tcp -j ACCEPT #开放对外开放端口 -A INPUT -p tcp --dport 80 -j ACCEPT #指定某端口针对IP开放 -A INPUT -s 192.168.10.37 -p tcp --dport 22 -j ACCEPT #拒绝所有协议(INPUT允许的情况) #-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,URG RST -j DROP # 允许已建立的或相关连的通行 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #拒绝ping -A INPUT -p tcp -m tcp -j REJECT --reject-with icmp-port-unreachable COMMIT # Completed on Fri Feb 9 12:10:37 2007
##################################
常用实例
#允许在IP访问指定端口 iptables -A INPUT -s 192.168.62.1 -p tcp --dport 22 -j ACCEPT #禁止使用某端口 iptables -A INPUT -p tcp --dport 22 -j DROP iptables -A INPUT -p tcp --dport 31 -j REJECT #禁止QQ端口 iptables -D FORWARD -p udp --dport 8000 -j REJECT #禁止icmp端口 #除192.168.62.1外,禁止其它人ping我的主机 iptables -A INPUT -i eth0 -s 192.168.62.1/32 -p icmp -m icmp --icmp-type 8 -j ACCEPT iptables -A INPUT -i eth0 -p icmp -m icmp --icmp-type 8 -j DROP #其它情况不允许 iptables -A INPUT -i eth0 -j DROP #禁止指定IP访问 iptables -A INPUT -p tcp -s IP -j DROP #禁止指定IP访问端口 iptables -A INPUT -p tcp -s IP --dport port -j DROP #阻止所有没有经过你系统授权的TCP连接 iptables -t filter -A INPUT -i eth0 -p tcp --syn -j DROP #添加网段转发 iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE #IP包流量限制 iptables -A INPUT -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT iptables -A INPUT -i eth0 -p icmp -j DROP #端口映射 iptables -t nat -A PREROUTING -i eth0 -p tcp -s 192.168.62.0/24 --dport 80 -j REDIRECT --to-ports 3128 #列出某规则链中的所有规则 iptables -L INPUT #删除某个规则链 ,不加规则链,清除所有非内建的 iptables -X allowed #将封包计数器归零 iptables -Z INPUT #定义新的规则链 iptables -N allowed #定义过滤政策 iptables -P INPUT DROP #修改某自订规则链的名称 iptables -E allowed disallowed #比对通讯协议类型是否相符 #-p ! tcp 排除tcp以外的udp、icmp。-p all所有类型 iptables -A INPUT -p tcp #比对封包的来源 IP #192.168.0.0/24 ! 反向对比 iptables -A INPUT -s 192.168.1.1 #比对封包的目的地 IP iptables -A INPUT -d 192.168.1.1 #比对封包是从哪片网卡进入 #eth+表示所有的网卡 iptables -A INPUT -i eth0 #比对封包要从哪片网卡送出 iptables -A FORWARD -o eth0 #比对某段时间内封包的平均流量 #例子是用来比对:每小时平均流量是否超过一次 3 个封包。 除了每小时平均次外,也可以每秒钟、每分钟或每天平均一次,默认值为每小时平均一次,参数如后: /second、 /minute、/day。 除了进行封数量的比对外,设定这个参数也会在条件达成时,暂停封包的比对动作,以避免因骇客使用洪水攻击法,导致服务被阻断。 iptables -A INPUT -m limit --limit 3/hour #比对瞬间大量封包的数量 #例子是用来比对一次同时涌入的封包是否超过 5 个(这是默认值),超过此上限的封包将被直接丢弃。使用效果同上。 iptables -A INPUT -m limit --limit-burst 5 #比对来自本机的封包 #是否为某特定使用者所产生的,这样可以避免服务器使用root或其它身分将敏感数据传送出,可以降低系统被骇的损失。可惜这个功能无法比对出来自其它主机的封包。 iptables -A OUTPUT -m owner --uid-owner 500 #比对来自本机的封包 iptables -A OUTPUT -m owner --gid-owner 0 iptables -A OUTPUT -m owner --pid-owner 78 iptables -A OUTPUT -m owner --sid-owner 100 #用来比对联机状态 iptables -A INPUT -m state --state RELATED,ESTABLISHED 联机状态共有四种:INVALID、ESTABLISHED、NEW 和 RELATED。 #-j参数指定进行的处理动作,处理动作包括:ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK,说明: iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset #可以传送的封包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset REDIRECT 将封包重新导向到另一个端口(PNAT) iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080 MASQUERADE 改写封包来源 IP 为防火墙 NIC IP iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000 LOG 将封包相关讯息纪录在 /var/log 中 iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets" SNAT 改写封包来源 IP 为某特定 IP 或 IP 范围 iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 194.236.50.155-194.236.50.160:1024-32000 DNAT 改写封包目的地 IP 为某特定 IP 或 IP 范围 iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10:80-100 MIRROR 镜射封包 QUEUE 中断过滤程序 RETURN 结束在目前规则炼中的过滤程序 MARK 将封包标上某个代号 ################################## iptables配置实例 允许某段IP访问任何端口 iptables -A INPUT -s 192.168.0.3/24 -p tcp -j ACCEPT 设定预设规则 (拒绝所有的数据包,再允许需要的,如只做WEB服务器.还是推荐三个链都是DROP) iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT (注:意直接设置这三条完已经掉线了) 开启22端口 iptables -A INPUT -p tcp --dport 22 -j ACCEPT 如果OUTPUT 设置成DROP的,要写上下面一条 iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT (注:,不写导致无法SSH.其他的端口一样,OUTPUT设置成DROP的话,也要添加一条链) 如果开启了web服务器,OUTPUT设置成DROP的话,同样也要添加一条链 iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT 做WEB服务器,开启80端口 ,其他同理 iptables -A INPUT -p tcp --dport 80 -j ACCEPT 做邮件服务器,开启25,110端口 iptables -A INPUT -p tcp --dport 110 -j ACCEPT iptables -A INPUT -p tcp --dport 25 -j ACCEPT 允许icmp包通过,允许ping iptables -A OUTPUT -p icmp -j ACCEPT (OUTPUT设置成DROP的话) iptables -A INPUT -p icmp -j ACCEPT (INPUT设置成DROP的话) 允许loopback!(不然会导致DNS无法正常关闭等问题) IPTABLES -A INPUT -i lo -p all -j ACCEPT (如果是INPUT DROP) IPTABLES -A OUTPUT -o lo -p all -j ACCEPT(如果是OUTPUT DROP)
====================================================================
---------------------------------- 4服务管理 ---------------------------------- 启动sendmail服务 ./sendmail start /etc/init.d/sendmail start
关闭sendmail服务 ./sendmail stop
查看sendmail服务当前状态 ./sendmail status
发送邮件 echo 内容| /bin/mail -s "标题" 收件箱 "`echo "内容"|iconv -f utf8 -t gbk`" | /bin/mail -s "`echo "标题"|iconv -f utf8 -t gbk`" 收件箱
打开服务列表 需要打* ntsysv
让某个服务不自动启动 35指的是运行级别 httpd:chkconfig --level 35 httpd off
让某个服务自动启动 httpd:chkconfig --level 35 httpd on
查看所有服务的启动状态 chkconfig --list
查看某个服务的启动状态 chkconfig --list |grep httpd
查看服务的状态 chkconfig –-list [服务名称]
设置非独立服务启状态 chkconfig 服务名 on|off|set
开启mysql后台运行 /usr/local/mysql/bin/mysqld_safe --user=mysql &
开机启动执行 vi /etc/rc.d/rc.local
开机启动和关机关闭服务连接 /etc/rc.d/rc3.d/S55sshd # S开机start K关机stop 55级别 后跟服务名 ln -s -f /usr/local/httpd/bin/apachectl /etc/rc.d/rc3.d/S15httpd
====================================================================
---------------------------------- 5网络管理 ----------------------------------
################################## 本机网络配置文件 vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0 BOOTPROTO=none BROADCAST=192.168.1.255 HWADDR=00:0C:29:3F:E1:EA IPADDR=192.168.1.55 NETMASK=255.255.255.0 NETWORK=192.168.1.0 ONBOOT=yes TYPE=Ethernet GATEWAY=192.168.1.1 ################################## 增加逻辑IP地址 ifconfig eth0:0 192.168.1.221 netmask 255.255.255.0
查看路由表 route
添加路由表 route add default gw 192.168.1.1 dev eth0
设置DNS vi /etc/resolv.conf
禁用网卡 ifconfig eth0 down
启用网卡 ifconfig eth0 up ifup eth0:0 up
测试跳数 traceroute www.baidu.com (linux) tracert www.baidu.com (windows)
根据IP和主机最大数计算掩码 ipcalc -m "$ip" -p "$num"
用 wget 的递归方式下载整个网站 wget --random-wait -r -p -e robots=off -U Mozilla www.example.com
通过 DNS 来读取 Wikipedia 的hacker词条 dig +short txt hacker.wp.dg.cx host -t txt hacker.wp.dg.cx
rz ssh小文件上传 sz ssh小文件下载
从linux ssh登录另一台linux ssh -p 22 wang@192.168.1.209
利用ssh操作远程主机 ssh -p 22 root@192.168.1.209 环境变量中脚本
把本地文件拷贝到远程主机 scp -P 22 文件 root@ip:/目录
ssh连接不提示yes ssh -o StrictHostKeyChecking=no 192.168.70.130
把远程指定文件拷贝到本地 scp root@192.168.1.209:远程目录 本地目录
通过 SSH 挂载远程主机上的文件夹 sshfs name@server:/path/to/folder /path/to/mount/point
卸载的话使用 fusermount 命令 fusermount -u /path/to/mount/point
用DIFF对比远程文件跟本地文件 ssh user@host cat /path/to/remotefile | diff /path/to/localfile -
用SSH创建端口转发通道 ssh -N -L2001:remotehost:80 user@somemachine
嵌套使用SSH ssh -t host_A ssh host_B
密钥信任 ssh-keygen –t rsa vi 用户/.ssh/authorized_keys
远程关掉一台WINDOWS机器 net rpc shutdown -I IP_ADDRESS -U username%password
禁ping echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
抓包 tcpdump tcp port 22
查看监听 netstat -anlp -a 显示所有连接中的Socket -t 显示TCP连接 -u 显示UDP连接 -n 显示所有已建立的有效连接
##################################
先ping在扫描主机开放端口 nmap -PT 192.168.1.1-111
扫描出系统内核版本 nmap -O 192.168.1.1
扫描端口的软件版本 nmap -sV 192.168.1.1-111
半开扫描(通常不会记录日志) nmap -sS 192.168.1.1-111
不支持windows的扫描(判断是否是windows) nmap -sF 192.168.1.1-111 nmap -sX 192.168.1.1-111 nmap -sN 192.168.1.1-111
不ping直接扫描 nmap -P0 192.168.1.1-111
详细信息 nmap -d 192.168.1.1-111
无法找出真正扫描主机(隐藏IP) nmap -D 192.168.1.1-111
端口范围 nmap -p 20-30,139,60000- 表示:扫描20到30号端口,139号端口以及所有大于60000的端口
组合扫描(不ping、软件版本、内核版本、详细信息) nmap -P0 -sV -O -v 192.168.30.251
##################################
====================================================================
---------------------------------- 6磁盘管理 ----------------------------------
查看硬盘容量 df -h
查看磁盘分区格式 df -T
修改只读文件系统为读写 mount -o remount,rw /
查看卷标 e2label /dev/sda5
创建卷标 e2label /dev/sda5 new-label
NTFS添加卷标 ntfslabel -v /dev/sda8 new-label
ext2分区转ext3分区 tune2fs -j /dev/sda
格式化分区 mkfs -t ext3 /dev/hda3
指定索引块大小 mke2fs -b 2048 /dev/sda5
对文件系统修复 fsck -y /dev/sda6
查看超级块的信息 dumpe2fs -h /dev/sda5
查看当前系统支持文件系统 cat /proc/filesystems
检测硬盘状态 smartctl -H /dev/sda
检测硬盘信息 smartctl -i /dev/sda
检测所有信息 smartctl -a /dev/sda
检测目录下所有文件大小 du -h 目录
显示当前目录中子目录的大小 du -h --max-depth=1
挂载光驱 mount -t iso9660 /dev/dvd /mnt
挂载镜像文件 mount -o loop /software/rhel4.6.iso /mnt/
##################################
磁盘grub开机引导项添加 /etc/grub.conf title ms-dos rootnoverify (hd0,0) chainloader +1
##################################
建立软RAID1 两块硬盘分区一样,分别新建分区文件类型为software RAID 创建两个就点击raid合并为RAID1,这里的挂载点为正常linux目录 查看raid工作状态 cat /proc/mdstat 两个盘都加grub引导 查看 cat /boot/grub/grub.conf grub root (hd0,0) setup (hd0) root (hd1,0) setup (hd1) 修改grub启动项配置文件 vi /boot/grub/grub.conf 复制title CentOS到最后的四行 在下面粘贴修改为刚才新加的引导(hd1,0)。 查看分区 sfdisk -d /dev/hda 导出A盘分区列表 sfdisk -d /dev/hda > fq.hda 将分区列表导入到新加的硬盘 sfdisk /dev/hdb < fq.hda 恢复新挂载的硬盘分区 mdadm /dev/md1 -a /dev/hdb5 # raid5可利用lvm扩容
##################################
新硬盘挂载 fdisk /dev/sdc p # 打印分区 d # 删除分区 n # 创建分区,(一块硬盘最多4个主分区,扩展占一个主分区位置。p主分区 e扩展) w # 保存退出 mkfs -t ext3 -L 卷标 /dev/sdc1 # 格式化相应分区 mount /dev/sdc1 /mnt # 挂载
添加开机挂载分区 vi /etc/fstab 用卷标挂载 LABEL=/data /data ext3 defaults 1 2 用真实分区挂载 /dev/sdb1 /data4 ext3 defaults 1 2
第一个数字"1"该选项被"dump"命令使用来检查一个文件系统应该以多快频率进行转储,若不需要转储就设置该字段为0 第二个数字"2"该字段被fsck命令用来决定在启动时需要被扫描的文件系统的顺序,根文件系统"/"对应该字段的值应该为1,其他文件系统应该为2。若该文件系统无需在启动时扫描则设置该字段为0
##################################
====================================================================
---------------------------------- 7用户管理 ----------------------------------
建立用户 useradd xuesong
修改密码 passwd 用户 echo "xuesong" | passwd xuesong --stdin
恢复密码 在linux出现grub后,在安装的系统上面按"e",然后出现grub的配置文件,按键盘移动光标到第二行"Ker……",再按"e",然后在这一行的结尾加上:空格 single或者空格1回车,然后按"b"重启,就进入了"单用户模式"。
查找用户显示信息 finger
添加组 groupadd
修改文件拥有者(R递归) chown -R
修改所有者用户中包含点"." chown y\.li:mysql
修改用户组 chgrp
修改用户名 usermod -l 新用户名 老用户名
修改用户所属组 usermod -g user group
修改用户家目录 usermod -d 目录 -m 用户
将用户添加到附加组 usermod -G user group
删除账号及家目录 userdel -r
指定组并不允许登录的用户 useradd -g www -M -s /sbin/nologin www
切换用户执行 su - user -c " #命令1 "
====================================================================
---------------------------------- 8脚本相关 ----------------------------------
##################################
正则表达式
^ 行首定位 $ 行为定位 . 匹配除换行符以外的任意字符 * 匹配0或多个重复字符 + 重复一次或更多次 重复零次或一次 [] 匹配一组中任意一个字符 [^] 匹配不在指定组内的字符 \ 用来转义元字符 \< 词首定位符(支持vi和grep) \<love \> 词尾定位符(支持vi和grep) love\> x\{m\} 重复出现m次 x\{m,\} 重复出现至少m次 x\{m,n\} 重复出现至少m次不超过n次 X? 匹配出现零次或一次的大写字母 X X+ 匹配一个或多个字母 X (abc|def)+ 匹配一连串的(最少一个) abc 或 def;abc 和 def 将匹配 \d 匹配任意一位数字 \D 匹配任意单个非数字字符 \w 匹配任意单个字母数字字符,同义词是 [:alnum:] \s 匹配任意的空白符 \b 匹配单词的开始或结束 [:alpha:] 代表所有字母不论大小写 [:lower:] 表示小写字母 [:upper:] 表示大写字母 [:digit:] 表示数字字符 () 括号内的字符为一组
##################################
基本流程结构
if [ $a == $b ] then echo "等于" else echo "不等于" fi ################################## case $xs in 0) echo "0" ;; 1) echo "1" ;; *) echo "其他" ;; esac ################################## num=1 # while true 等同 while : while [ $num -lt 10 ] do echo $num ((num=$num+2)) done ################################## grep a a.txt | while read a do echo $a done ################################## w=`awk -F ":" '{print $1}' c` for d in $w do $d done ################################## for ((i=0;i<${#o[*]};i++)) do echo ${o[$i]} done ################################## until循环# 当command不为0时 until command do body done ################################## 流程控制 break N # 跳出几层循环 continue N # 跳出几层循环,循环次数不变 continue # 重新循环次数不变 ##################################
变量 将 变量A 赋值为字串 A="a b c def" A=`命令` 间接调用 eval a=\$$a 将 变量A 定义为組数 A=(a b c def) set a1 a2 a3 a4 $1 $2 $* 在子shell中运行 (a=bbk)
定义变量类型 declare或者typeset -r 只读(readonly一样) -i 整形 -a 数组 -f 函数 -x export declare -i n=0
env # 查看环境变量 env | grep "name" # 查看定义的环境变量 set # 查看环境变量和本地变量 read name # 输入变量 readonly name # 把name这个变量设置为只读变量,不允许再次设置 readonly # 查看系统存在的只读文件 export name # 变量name由本地升为环境 export name="RedHat" # 直接定义name为环境变量 export Stat$nu=2222 # 变量引用变量赋值 unset name # 变量清除 export -n name # 去掉只读变量 shift # 用于移动位置变量,调整位置变量,使$3的值赋给$2.$2的值赋予$1 name + 0 # 将字符串转换为数字 number " " # 将数字转换成字符串
常用系统变量 $0 # 脚本启动名(包括路径) basename $0 # 只取脚本名 $n # 当前程式的第n个参数,n=1,2,…9 $* # 当前程式的所有参数(不包括脚本本身) $# # 当前程式的参数个数(不包括脚本本身) $$ # 当前程式的PID $! # 执行上一个指令的PID $? # 执行上一个指令的返回值
变量引用技巧 ${} ${name:+value} # 如果设置了name,就把value显示,未设置则为空 ${name:-value} # 如果设置了name,就显示它,未设置就显示value ${name:?value} # 未设置提示用户错误信息value ${name:=value} # 如未设置就把value设置并显示<写入本地中>, ${#A} # 可得到变量中字节 ${#A[*]} # 数组个数 ${A[2]} # 脚本的一个参数 ${A:4:9} # 取变量中第4位到后面9位 ${A/www/http} # 取变量并且替换每行第一个关键字 ${A//www/http} # 取变量并且全部替换每行关键字 定义了一个变量为: file=/dir1/dir2/dir3/my.file.txt ${file#*/} # 去掉第一条 / 及其左边的字串:dir1/dir2/dir3/my.file.txt ${file##*/} # 去掉最后一条 / 及其左边的字串:my.file.txt ${file#*.} # 去掉第一个 . 及其左边的字串:file.txt ${file##*.} # 去掉最后一个 . 及其左边的字串:txt ${file%/*} # 去掉最后条 / 及其右边的字串:/dir1/dir2/dir3 ${file%%/*} # 去掉第一条 / 及其右边的字串:(空值) ${file%.*} # 去掉最后一个 . 及其右边的字串:/dir1/dir2/dir3/my.file ${file%%.*} # 去掉第一个 . 及其右边的字串:/dir1/dir2/dir3/my # # 是去掉左边(在键盘上 # 在 $ 之左边) # % 是去掉右边(在键盘上 % 在 $ 之右边) # 单一符号是最小匹配﹔两个符号是最大匹配
##################################
test条件判断 # 符号 [ ] 等同 test
expression为字符串操作
-n str # 字符串str是否不为空 -z str # 字符串str是否为空
expression为文件操作
-b # 是否块文件 -p # 文件是否为一个命名管道 -c # 是否字符文件 -r # 文件是否可读 -d # 是否一个目录 -s # 文件的长度是否不为零 -e # 文件是否存在 -S # 是否为套接字文件 -f # 是否普通文件 -x # 文件是否可执行,则为真 -g # 是否设置了文件的 SGID 位 -u # 是否设置了文件的 SUID 位 -G # 文件是否存在且归该组所有 -w # 文件是否可写,则为真 -k # 文件是否设置了的粘贴位 -t fd # fd 是否是个和终端相连的打开的文件描述符(fd 默认为 1) -O # 文件是否存在且归该用户所有 ! # 取反
expression为整数操作
expr1 -a expr2 # 如果 expr1 和 expr2 评估为真,则为真 expr1 -o expr2 # 如果 expr1 或 expr2 评估为真,则为真
两值比较
整数 字符串 -lt <: # 小于 -gt >: # 大于 -le <=: # 小于或等于 -ge >=: # 大于或等于 -eq ==: # 等不等 -ne !=: # 不等于
判断大小,0为真,1为假 test 10 -lt 5 echo $? 1 判断字符串长度是否为0 test -n "hello" 0
##################################
重定向 # 标准输出 stdout 和 标准错误 stderr 标准输入stdin cmd 1> fiel # 把 标准输出 重定向到 file 文件中 cmd > file 2>&1 # 把 标准输出 和 标准错误 一起重定向到 file 文件中 cmd 2> file # 把 标准错误 重定向到 file 文件中 cmd 2>> file # 把 标准错误 重定向到 file 文件中(追加) cmd >> file 2>&1 # 把 标准输出 和 标准错误 一起重定向到 file 文件中(追加) cmd < file >file2 # cmd 命令以 file 文件作为 stdin(标准输入),以 file2 文件作为 标准输出 cat <>file # 以读写的方式打开 file cmd < file cmd # 命令以 file 文件作为 stdin cmd << delimiter cmd; #从 stdin 中读入,直至遇到 delimiter 分界符。 delimiter
>&n # 使用系统调用 dup (2) 复制文件描述符 n 并把结果用作标准输出 <&n # 标准输入复制自文件描述符 n <&- # 关闭标准输入(键盘) >&- # 关闭标准输出 n<&- # 表示将 n 号输入关闭 n>&- # 表示将 n 号输出关闭
##################################
运算符 $[]等同于$(()) # $[]表示形式告诉shell求中括号中的表达式的值 ~var # 按位取反运算符,把var中所有的二进制为1的变为0,为0的变为1 var\<<str # 左移运算符,把var中的二进制位向左移动str位,忽略最左端移出的各位,最右端的各位上补上0值,每做一次按位左移就有var乘2 var>>str # 右移运算符,把var中所有的二进制位向右移动str位,忽略最右移出的各位,最左的各位上补0,每次做一次右移就有实现var除以2 var&str # 与比较运算符,var和str对应位,对于每个二进制来说,如果二都为1,结果为1.否则为0 var^str # 异或运算符,比较var和str对应位,对于二进制来说如果二者互补,结果为1,否则为0 var|str # 或运算符,比较var和str的对应位,对于每个二进制来说,如二都该位有一个1或都是1,结果为1,否则为0
运算符的优先级 级别 运算符 说明 1 =,+=,-=,/=,%=,*=,&=,^=,|=,<<=,>>== # 赋值运算符 2 || # 逻辑或 前面不成功执行 3 && # 逻辑与 前面成功后执行 4 | # 按位或 5 ^ # 按异位与 6 & # 按位与 7 ==,!= # 等于/不等于 8 <=,>=,<,> # 大于或等于/小于或等于/大于/小于 9 \<<,>> # 按位左移/按位右移 (无转意符号) 10 +,- # 加减 11 *,/,% # 乘,除,取余 12 ! ,~ # 逻辑非,按位取反或补码 13 -,+ # 正负
##################################
数学运算 $(( )) 整数运算符号大致有这些: + - * / **:分別为 "加、減、乘、除、密运算" & | ^ !:分別为 "AND、OR、XOR、NOT" 运算 % :余数运算
运算 let let x=16/4 let x=5**5
手工命令行计数器 expr SUM=`expr 2 \* 3`
计算字串长度 expr length "bkeep zbb"
抓取字串 expr substr "bkeep zbb" 4 9
抓取第一个字符数字串出现的位置 expr index "bkeep zbb" e
整数运算 expr 14 % 9 expr 30 / 3 / 2 # 运算符号有空格
增量计数(加循环即可) LOOP=0 LOOP=`expr $LOOP + 1`
数值测试(如果试图计算非整数,则会返回错误。) rr=3.4 expr $rr + 1 expr: non-numeric argument rr=5 expr $rr + 1 6
模式匹配(可以使用expr通过指定冒号选项计算字符串中字符数) .* 意即任何字符重复0次或多次 expr bkeep.doc : '.*'
在expr中可以使用字符串匹配操作,这里使用模式抽取.doc文件附属名。 expr bkeep.doc : '\(.*\).doc'
次方计算 echo "m^n"|bc
##################################
grep用法 -c 显示匹配到得行的数目,不显示内容 -h 不显示文件名 -i 忽略大小写 -l 只列出匹配行所在文件的文件名 -n 在每一行中加上相对行号 -s 无声操作只显示报错,检查退出状态 -v 反向查找 -e 使用正则表达式 -A3 打印匹配行和下三行 -w 精确匹配 -wc 精确匹配次数 grep可用于if判断,找到$?为then
过滤关键字符行 grep -v "a" txt
精确匹配字符串 grep -w 'a\>' txt
大小写敏感 grep -i "a" txt
同时匹配大小写 grep "a[bB]" txt
查找0-9重复三次的所在行 grep '[0-9]\{3\}' txt
任意条件匹配 grep -E "word1|word2|word3" file
同时匹配三个 grep word1 file | grep word2 |grep word3
##################################
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中特定控制字符的不同表达方式 速记符含义八进制方式 \a Ctrl-G 铃声\007 \b Ctrl-H 退格符\010 \f Ctrl-L 走行换页\014 \n Ctrl-J 新行\012 \r Ctrl-M 回车\015 \t Ctrl-I tab键\011 \v Ctrl-X \030
将所有大写转换成小写字母 tr A-Z a-z
将空格替换为换行 tr " " "\n"
删除空行 tr -s "[\012]" < plan.txt tr -s ["\n"] < plan.txt
删除文件中的^M,并代之以换行 tr -s "[\015]" "[\n]" < file tr -s "[\r]" "[\n]" < file
替换passwd文件中所有冒号,代之以tab键 tr -s "[:]" "[\011]" < /etc/passwd tr -s "[:]" "[\t]" < /etc/passwd
增加显示路径可读性 echo $PATH | tr ":" "\n"
tr在vi内使用,在tr前加处理行范围和感叹号('$'表示最后一行) 1,$!tr -d '\t'
Mac -> UNIX tr "\r" "\n"<macfile > unixfile
UNIX -> Mac tr "\n" "\r"<unixfile > macfile
DOS -> UNIX Microsoft DOS/Windows 约定,文本的每行以回车字符(\r)并后跟换行符(\n)结束 tr -d "\r"<dosfile > unixfile
UNIX -> DOS:在这种情况下,需要用awk,因为tr不能插入两个字符来替换一个字符 awk '{ print $0"\r" }'<unixfile > dosfile
##################################
awk用法 \b 退格 \f 换页 \n 换行 \r 回车 \t 制表符Tab \c 代表任一其他字符 -F 改变FS值(分隔符)
~ 匹配 = 赋值 == 匹配 += 叠加
[:alnum:] 字母数字字符 [:alpha:] 字母字符 [:cntrl:] 控制字符 [:digit:] 数字字符 [:graph:] 非空白字符(非空格、控制字符等) [:lower:] 小写字母 [:print:] 与[:graph:]相似,但是包含空格字符 [:punct:] 标点字符 [:space:] 所有的空白字符(换行符、空格、制表符) [:upper:] 大写字母 [:xdigit:] 十六进制的数字(0-9a-fA-F)
内建变量 $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 结束时处理
[[:digit:][:lower:]] 数字和小写字母(占一个字符) -F"[ ]+|[%]+" 已多个空格或多个%为分隔符 [a-z]+ 多个小写字母 [a-Z] 代表所有大小写字母(aAbB...zZ) [a-z] 代表所有大小写字母(ab...z)
打印匹配到得行 awk '/Tom/' 文件
如果第三个字段值小于4000才打印 awk '$3 <4000' 文件
匹配Tom开头的行 打印第一个字段 awk '/^Tom/{print $1}'
显示所有第一个字段不是以ly结尾的行 awk '$1 !~ /ly$/' 文件
条件判断(如果$1大于$2,max值为为$1,否则为$2) awk '{max=($1 > $2) ? $1 : $2; print max}' 文件 awk '{print ($1>$2)?"第一排"$1:"第二排"$2}' e.txt (括号代表if语句判断 "?"代表then ":"代表else)
算术运算(第三个字段和第四个字段乘积大于500则显示) awk '$3 * $4 > 500' 文件
打印tom到suz之间的行 awk '/tom/,/suz/' 文件
去掉前三行 awk '{$1="";$2="";$3="";print}' a.sh
将date值赋给d,并将d设置为数组mon,打印mon数组中第2个元素 awk 'BEGIN{ "date" | getline d; split(d,mon) ; print mon[2]}' 文件
以空格、:、制表符Tab为分隔符 awk -F'[ :\t]' '{print $1,$2}'
取关键字下第几行 awk '/关键字/{a=NR+2}a==NR {print}'
awk中引用变量 a=22aa &&echo 88:99:44|awk -F":" '{print $1,"'"$a"'",$2,$3}'
指定类型(%d数字,%s字符) /sbin/ifconfig |awk '{printf("line %d,%s\n",NR,$0)}' awk -v RS=# 'NF{for(i=1;i<=NF;i++)if($i) printf $i;print ""}' 文件
awk加if判断 awk '{if ( $6 > 50) print $1 " Too high" ;\ else print "Range is OK"}' file awk '{if ( $6 > 50) { count++;print $3 } \ else { x+5; print $2 } }' file
awk加循环 awk '{i = 1; while ( i <= NF ) { print NF, $i ; i++ } }' file awk '{ for ( i = 1; i <= NF; i++ ) print NF,$i }' file
提取时间,空格不固定 ll | awk -F'[ ]+|[ ][ ]+' '/^$/{print $8}'
查看磁盘空间 df|awk -F"[ ]+|%" '$5>14{print $5}'
取出第四列等于90的第五列 awk '$4==90{print $5}'
打印所有以模式no或so开头的行 awk '/^(no|so)/' test
排列打印 awk 'END{printf "%-10s%-10s\n%-10s%-10s\n%-10s%-10s\n","server","name","123","12345","234","1234"}' txt awk '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中计算(求余数) echo list|awk '{ i=($1%100);if ( $i >= 0 ) {print $0,$i}}'
sub匹配第一次出现的符合模式的字符串,相当于 sed 's//' awk '{sub(/Mac/,"Macintosh");print}' urfile #用Macintosh替换Mac
gsub匹配所有的符合模式的字符串,相当于 sed 's//g' awk '{sub(/Mac/,"MacIntosh",$1); print}' file #第一个域内用Macintosh替换Mac
处理sql语句 cat 1.txt|awk -F" # " '{print "insert into user (user,password,email)values(""'\''"$1"'\'\,'""'\''"$2"'\'\,'""'\''"$3"'\'\)\;'"}' >>insert_1.txt
引用外部变量 awk '{print "'"$a"'","'"$b"'"}'
在END块里面把数组内容写到文件 awk -F: '{name[x++]=$1};END{for(i=0;i<NR;i++)print i,name[i]}' data >tmp
将$1的值叠加后赋给sum awk 'sum+=$1{print sum}' <<EOF 1 11 111 2 22 222 8 33 333 10 44 444 EOF
加入END只打印最后的结果 awk '{sum2+=$2;count=count+1}END{print sum2,sum2/count}' <<EOF 1324236000: 4.8726625090e+06 1.4806911317e+07 1324236300: 3.1952608823e+05 1.3144868085e+07 1324236600: 5.0792587262e+05 1.4931600767e+07 EOF #结果中第一个值是$2的总和 第二个值是$3的总和 第三个值是$2总和除个数(平均值) 第四个值是$3总和除个数(平均值) #e+06 是科学计数法,表示乘以10的6次方
awk '{sum2+=$2;count=count+1}END{print sum2,sum2/count}' <<EOF 1: 3 30 2: 6 60 3: 9 90 EOF
列求和 cat txt |awk '{a+=$1}END{print a}'
列求平均值 cat txt |awk '{a+=$1}END{print a/NR}'
列求最大值 cat txt |awk 'BEGIN{a=0}{if ($1>a) a=$1 fi}END{print a}' #设定一个变量开始为0,遇到比该数大的值,就赋值给该变量,直到结束
求最小值 cat txt |awk 'BEGIN{a=11111}{if ($1<a) a=$1 fi}END{print a}'
判断$1是否整除(awk中定义变量引用时不能带 $ ) cat txt |awk '{ i=$1%10;if ( i == 0 ) {print i}}'
##################################
sed用法 -n 输出由编辑指令控制(取消默认的输出,必须与编辑指令一起配合) -i 直接对文件操作 -e 多重编辑 #修改文件先加 -i
p 打印 d 删除 s 替换 g 配合s全部替换 i 行前插入 a 行后插入 r 读 y 转换 q 退出
\(..\) 保存..作为标签1(\1) & 代表查找的串内容 * 前导符 $ 最后一行 .* 匹配任意多个字符
模式空间(两行两行处理) N 将第二行追加到第一行 将换行符\n替换空极为一行 n 将第二行覆盖到第一行 h 把模式空间里的行拷贝到暂存空间 H 把模式空间里的行追加到暂存空间 g 用暂存空间的内容替换模式空间的行 G 把暂存空间的内容追加到模式空间的行后 x 将暂存空间的内容于模式空间里的当前行互换 ! 对所选行以外的所有行应用命令。 注意:暂存空间里默认存储一个空行。
sed命令替换并打印出替换行( -i改变文本) sed -n -e "{s/文本(正则表达式)/替换的文本/p}"
打印并删除正则表达式的那部分内容 sed -n -e "{s/^ *[0-9]*//p}"
删除匹配行 sed -i "/^$f/d" a
删除匹配行到末尾 sed -i '/ppppppppppp/,$d' incl
直接对文本替换 sed -i "s/=/:/" c
找到pearls开头在行尾加j sed -i "/^pearls/s/$/j/" ab.txt
标签(保存\(mar\)作为标签1) sed -n 's/\(mar\)got/\1ianne/p' 文件 echo "margot"|sed -n 's/\(mar\).*\(t\)/\1\2/p' sed -e 's/^\([a-zA-Z]\+\) \([a-zA-Z]\+\)\(.*\)/\2 \1\3/g' file
在以[0-9][0-9]结尾的行后加5 sed 's/[0-9][0-9]$/&5' 文件
打印从第5行到以no开头行之间的所有行 sed -n '5,/^no/p' 文件
修改west和east之间的所有行,在结尾处加*VACA* sed '/west/,/east/s/$/*VACA*/' 文件
多重编辑(先删除1-3行,在将1替换成2) sed -i -e '1,3d' -e 's/1/2/' 文件
找到含suan的行,在后面加上读入的文件内容 sed '/suan/r 读入文件' 文件
找到含no的行,写入到指定文件中 sed -n '/no/w 写入文件' 文件
取出第一组数字,并且忽略掉开头的0 sed 's/[^1-9]*\([0-9]\+\).*/\1/'
打印1和3之间的行 sed '/1/,/3/p' file
取出指定行 sed -n '1p' 文件
在第5行之前插入行 sed '5i\aaa' file
在第5行之后抽入行 sed '5a\aaa' file
在匹配行前插入一行 echo a|sed -e '/a/i\b'
在匹配行后插入一行 echo a|sed -e '/a/a\b' echo a|sed 's/a/&\nb/g'
引用外部变量 sed -n ''$a',10p' sed -n ""$a",10p"
取用户家目录(匹配不为/的字符和匹配:到结尾的字符全部删除) sed -n '{s/^[^\/]*//;s/\:.*//;p}' /etc/passwd
将换行符转换为换行 echo abcd\\nabcde |sed 's/\\n/@/g' |tr '@' '\n'
删除掉@后面所有字符,和空行 sed -e 's/@.*//g' -e '/^$/d'
将几行合并成一行 echo $(cat file)|sed 's/ //g'
取一列最大值 cat tmp|awk '{print $1}'|sort -n|sed -n '$p'
查找属主权限为7的文件 ls -l|sed -n '/^.rwx.*/p'
在a前面加#号 echo a|sed -e 's/a/#&/g'
##################################
图形dialog 多选界面[方括号] dialog --title "Check me" --checklist "Pick Numbers" 15 25 3 1 "one" "off" 2 "two" "on" 3 "three" "off" 2>tmp
多选界面(圆括号) dialog --title "title" --radiolist "checklist" 20 60 14 tag1 "item1" on tag2 "item2" off 2>tmp
单选界面 dialog --title "title" --menu "MENU" 20 60 14 tag1 "item1" tag2 "item2" 2>tmp
进度条 dialog --title "Installation" --backtitle "Star Linux" --gauge "Linux Kernel" 10 60 50
选择yes/no dialog --title "标题" --backtitle "Dialog" --yesno "说明" 20 60
公告 dialog --title "公告标题" --backtitle "Dialog" --msgbox "内容" 20 60
显示讯息后立即离开 dialog --title "hey" --backtitle "Dialog" --infobox "Is everything okay?" 10 60
输入对话框 dialog --title "hey" --backtitle "Dialog" --inputbox "Is okay?" 10 60 "yes"
显示文档内容 dialog --title "Array 30" --backtitle "All " --textbox /root/txt 20 75
多条输入对话框 dialog --title "Add a user" --form "Add a user" 12 40 4 "Username:" 1 1 "" 1 15 15 0 "Full name:" 2 1 "" 2 15 15 0 2>tmp
星号显示输入--insecure dialog --title "Password" --insecure --passwordbox "请输入密码" 10 35
选择日期 dialog --stdout --title "日历" --calendar "请选择" 0 0 9 1 2010
##################################
脚本头 # sh为当前系统默认shell,可指定为bash等 #!/bin/sh
临时文件定义 errtmp=/tmp/$$`date +%s%N`.errtmp outtmp=/tmp/$$`date +%s%N`.outtmp true > $outtmp
随机数 $RANDOM
进程号 $$
纳秒 date +%N
在当前bash环境下读取并执行FileName中的命令 source file-name # 等同 . FileName
间隔睡眠5秒 sleep 5
在接收到信号后将要采取的行动 trap
当前目录 $PWD
之前一个目录的路径 $OLDPWD
返回上一个目录路径 cd -
重复打印 yes
自动回答y或者其他 yes |rm -i *
查看目录所有文件夹 ls -p /home
查看匹配完整路径 ls -d /home/
命令替换xargs #将前面的内容,作为后面命令的参数 find / -perm +7000 | xargs ls -l
不换行执行下一句话 echo -n aa;echo bb
使转义生效 echo -e "s\tss\n\n\n"
取字符串中字元 echo $a | cut -c2-6
排列组合(括号内一个元素分别和其他括号内元素组合) echo {a,b,c}{a,b,c}{a,b,c}
返回目录名 pwd | awk -F/ '{ print "目录名:" ,$2 }'
倒置读取文件 # 删除最后3行 tac file |sed 1,3d|tac
替换上一条命令中的(foo)一个短语(bar) ^foo^bar^ !!:s/foo/bar/ !!:gs/foo/bar
##################################
shell例子
判断参数是否为空-空退出并打印null #!/bin/sh echo $1 name=${1:?"null"} echo $name
##################################
循环数组 for ((i=0;i<${#o[*]};i++)) do echo ${o[$i]} done
##################################
判断路径 if [ -d /root/Desktop/text/123 ];then echo "找到了123" if [ -d /root/Desktop/text ] then echo "找到了text" else echo "没找到text" fi else echo "没找到123文件夹" fi
##################################
匹配替换密码 #!/bin/sh cat mailpassword > temp.txt sed -i "s/:/ = /" temp.txt w=`awk -F " = " '{print $1}' temp.txt` for d in $w do grep -w $d svnpassword >/dev/null if [ $? -eq 0 ] then sed -i "/^$d/d" svnpassword grep "^$d" temp.txt >> svnpassword #替换到转义就出问题 #sed -i "/^$d/c $(grep "^$d" temp.txt)" svnpassword fi done rm temp.txt
##################################
多行合并
将两行并为一行(去掉换行符) sed '{N;s/\n//}' file
将4行合并为一行(可扩展) awk '{if (NR%4==0){print $0} else {printf"%s ",$0}}' file 将所有行合并 awk '{printf"%s ",$0}'
##################################
shift用法 ./cs.sh 1 2 3 #!/bin/sh until [ $# -eq 0 ] do echo "第一个参数为: $1 参数个数为: $#" #shift 命令执行前变量 $1 的值在shift命令执行后不可用 shift done
##################################
给脚本加参数getopts #!/bin/sh while getopts :ab: name do case $name in a) aflag=1 ;; b) bflag=1 bval=$OPTARG ;; \?) echo "USAGE:`basename $0` [-a] [-b value]" exit 1 ;; esac done if [ ! -z $aflag ] ; then echo "option -a specified" echo "$aflag" echo "$OPTIND" fi if [ ! -z $bflag ] ; then echo "option -b specified" echo "$bflag" echo "$bval" echo "$OPTIND" fi echo "here $OPTIND" shift $(($OPTIND -1)) echo "$OPTIND" echo " `shift $(($OPTIND -1))` "
##################################
判断脚本参数是否正确
./test.sh -p 123 -P 3306 -h 127.0.0.1 -u root #!/bin/sh if [ $# -ne 8 ];then echo "USAGE: $0 -u user -p passwd -P port -h host" exit 1 fi
while getopts :u:p:P:h: name do case $name in u) mysql_user=$OPTARG ;; p) mysql_passwd=$OPTARG ;; P) mysql_port=$OPTARG ;; h) mysql_host=$OPTARG ;; *) echo "USAGE: $0 -u user -p passwd -P port -h host" exit 1 ;; esac done
if [ -z $mysql_user ] || [ -z $mysql_passwd ] || [ -z $mysql_port ] || [ -z $mysql_host ] then echo "USAGE: $0 -u user -p passwd -P port -h host" exit 1 fi
echo $mysql_user $mysql_passwd $mysql_port $mysql_host #结果 root 123 3306 127.0.0.1
##################################
dialog取值接值退出 outtmp=/tmp/outtmp dialog --no-shadow --backtitle "雪松制作" --title "请选择" --ok-label "提交" --cancel-label "取消" --menu "请选择" 10 60 0 \ 1 "[目录]" \ q "[退出]" \ 2> $outtmp #判断提交取消 if [ $? == "1" ] then break #continue fi #只判断退出 pt=`awk '{print}' $outtmp` if [ $pt == q ] then break fi #判断操作 case $pt in 1) #操作 ;; q) exit #break ;; esac
##################################
dialog输入对话框加判断 while : do outtmp=/tmp/outtmp dialog --title "雪松制作" --form "请输入" 20 60 10 "用户:" 1 2 "" 1 15 35 0 "ID:" 2 2 "" 2 15 35 0 "" 6 2 "" 6 0 0 0 "输入格式如下" 7 2 "" 7 0 0 0 "说明" 8 2 "" 8 0 0 0 2> $outtmp yh=`sed -n '1p' $outtmp` id=`sed -n '2p' $outtmp` if echo $yh | grep -e '^[1-9][0-9]\{0,2\}' > /dev/null 2>&1 then if echo $id | grep -e '^[1-9][0-9]\{0,12\}' > /dev/null 2>&1 then break else echo "您输入的不合法,请从新输入!" fi else echo "您输入的不合法,请从新输入!" fi done
##################################
打印表格 #!/bin/sh clear awk 'BEGIN{ print "+--------------------+--------------------+"; printf "|%-20s|%-20s|\n","Name","Number"; print "+--------------------+--------------------+"; }' a=`grep "^[A-Z]" a.txt |sort +1 -n |awk '{print $1":"$2}'` #cat a.txt |sort +1 -n |while read list for list in $a do name=`echo $list |awk -F: '{print $1}'` number=`echo $list |awk -F: '{print $2}'` awk 'BEGIN{printf "|%-20s|%-20s|\n","'"$name"'","'"$number"'"; print "+--------------------+--------------------+"; }' done awk 'BEGIN{ print " *** The End *** " print " " }'
##################################
判断日期是否合法 #!/bin/sh while read a do if echo $a | grep -q "-" && date -d $a +%Y%m%d > /dev/null 2>&1 then if echo $a | grep -e '^[0-9]\{4\}-[01][0-9]-[0-3][0-9]$' then break else echo "您输入的日期不合法,请从新输入!" fi else echo "您输入的日期不合法,请从新输入!" fi done echo "日期为$a"
##################################
打印日期段所有日期 #!/bin/bash qsrq=20010101 jsrq=20010227 n=0 >tmp while :;do current=$(date +%Y%m%d -d"$n day $qsrq") if [[ $current == $jsrq ]];then echo $current >>tmp;break else echo $current >>tmp ((n++)) fi done rq=`awk 'NR==1{print}' tmp`
##################################
打印提示 cat <<EOF #内容 EOF
登陆远程执行命令(特殊符号需要\转义) ssh root@ip << EOF #执行命令 EOF
登陆mysql执行命令 mysql -uroot -ppasswd -S mysql.sock --default-character-set=gbk -A<<EOF>outtmp #mysql命令 EOF
##################################
数学计算的小算法
#!/bin/sh A=1 B=1 while [ $A -le 10 ] do SUM=`expr $A \* $B` echo "$SUM" if [ $A = 10 ] then B=`expr $B + 1` A=1 fi A=`expr $A + 1` done
##################################
竖行转横行(三种)
cat file|tr '\n' ' ' echo $(cat file) #!/bin/sh for i in `cat file` do a=${a}" "${i} done echo $a
##################################
取用户的根目录
#! /bin/bash #showhome.sh IFS=: while read name pass uid gid gecos home shell do echo $home done
执行./showhome.sh < /etc/passwd
##################################
把汉字转成encode格式:
echo 论坛 | tr -d "\n" | xxd -i | sed -e "s/ 0x/%/g" | tr -d " ,\n" %c2%db%cc%b3 大写的: echo 论坛 | tr -d "\n" | xxd -i | sed -e "s/ 0x/%/g" | tr -d " ,\n" | tr "[a-f]" "[A-F]" %C2%DB%CC%B3
##################################
把带有大写字母的文件名改为全部小写
#!/bin/bash for f in *;do mv $f `echo $f |tr "[A-Z]" "[a-z]"` done ##################################
查找连续多行,在不连续的行前插入
#/bin/bash lastrow=null i=0 cat incl|while read line do i=`expr $i + 1` if echo "$lastrow" | grep "#include <[A-Z].h>" then if echo "$line" | grep -v "#include <[A-Z].h>" then sed -i ''$i'i\\/\/All header files are include' incl i=`expr $i + 1` fi fi lastrow="$line" done
##################################
查询数据库其它引擎
#/bin/bash path1=/data/mysql/data/ dbpasswd=db123 #MyISAM或InnoDB engine=InnoDB
if [ -d $path1 ];then
dir=`ls -p $path1 |awk '/\/$/'|awk -F'/' '{print $1}'` for db in $dir do number=`mysql -uroot -p$dbpasswd -A -S "$path1"mysql.sock -e "use ${db};show table status;" |grep -c $engine` if [ $number -ne 0 ];then echo "${db}" fi done fi
##################################
批量修改数据库引擎 #/bin/bash for db in test test1 test3 do tables=`mysql -uroot -pdb123 -A -S /data/mysql/data/mysql.sock -e "use $db;show tables;" |awk 'NR != 1{print}'`
for table in $tables do mysql -uroot -pdb123 -A -S /data/mysql/data/mysql.sock -e "use $db;alter table $table engine=MyISAM;" done
done
##################################
|