Linux系统运维常用命令大全
作为Linux运维,需要了解Linux操作系统的基本使用和管理知识,下面路饭小编给大家介绍下Linux运维需要掌握的命令,想成为Linux运维的朋友可以来学习一下。
1 文件管理2 软件管理3 系统管理
4 服务管理5 网络管理6 磁盘管理 7 用户管理8 脚本相关9 服务配置 ==================================----------------------------------
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] 文件或目录 向下分面器 more 搜索 locate 字符串 查看行数 wc -l 实时某个目录下查看最新改动过的文件 watch -d -n 1 'df; ls -FlAt /path' 快速备份一个文件 cp filename{,.bak} ################################## 配置编辑器 gconf-editor vi 配置文件 vi /etc/vimrc 编辑文件 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 打包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 解压zip unzip zip.zip 压缩zip zip zip.zip * rar3.6 下载地址 http://www.rarsoft.com/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 \@#]\$' 开机启动模式 vi /etc/inittab 查找命令的目录 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 端口号 查看监听 netstat -anlp 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.fedoraproject.org/pub/epel wget http://download.fedoraproject.org/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 -------------------------------------------------------------------- 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 "标题" 收件箱 打开服务列表需要打* 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 ################################## 先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 查找用户显示信息 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 使用正则表达式 -A1 打印匹配行和下一行 -wc 匹配出现次数 grep 可用于if 判断,找到$?为then 过滤关键字符行 grep -v "a" txt 精确匹配字符串 grep '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 多重编辑 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 "s/=/:/" c 找到pearls 开头在行尾加jcui sed -i "/^pearls/s/$/jcui/" 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 -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 }' 替换上一条命令中的(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