分享

运维常用linux命令\shell技巧范例

 晶晶suky 2012-05-03

运维常用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 

##################################

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多