常用命令:
find查找{# linux文件无创建时间
# Access 使用时间# Modify 内容修改时间# Change 状态改变时间(权限、属主)# 时间默认以24小时为单位,当前时间到向前24小时为0天,向前48-72小时为2天# -and 且 匹配两个条件 参数可以确定时间范围 -mtime +2 -and -mtime -4# -or 或 匹配任意一个条件find /etc -name "*http*" # 按文件名查找
find . -type f # 查找某一类型文件find / -perm # 按照文件权限查找find / -user # 按照文件属主查找find / -group # 按照文件所属的组来查找文件find / -atime -n # 文件使用时间在N天以内find / -atime +n # 文件使用时间在N天以前find / -mtime +n # 文件内容改变时间在N天以前find / -ctime +n # 文件状态改变时间在N天前find / -mmin +30 # 按分钟查找内容改变find / -size +1000000c -print # 查找文件长度大于1M字节的文件find /etc -name "*passwd*" -exec grep "xuesong" {} \; # 按名字查找文件传递给-exec后命令find . -name 't*' -exec basename {} \; # 查找文件名,不取路径find . -type f -name "err*" -exec rename err ERR {} \; # 批量改名(查找err 替换为 ERR {}文件find path -name *name1* -or -name *name2* # 查找任意一个关键字}
sort排序{
-t # 指定排序时所用的栏位分隔字符
-n # 依照数值的大小排序-r # 以相反的顺序来排序-f # 排序时,将小写字母视为大写字母-d # 排序时,处理英文字母、数字及空格字符外,忽略其他的字符-c # 检查文件是否已经按照顺序排序-b # 忽略每行前面开始处的空格字符-M # 前面3个字母依照月份的缩写进行排序-k # 指定域-m # 将几个排序好的文件进行合并-T # 指定临时文件目录,默认在/tmp-o # 将排序后的结果存入指定的文sort -n # 按数字排序
sort -nr # 按数字倒叙sort -u # 过滤重复行sort -m a.txt c.txt # 将两个文件内容整合到一起sort -n -t' ' -k 2 -k 3 a.txt # 第二域相同,将从第三域进行升降处理sort -n -t':' -k 3r a.txt # 以:为分割域的第三域进行倒叙排列sort -k 1.3 a.txt # 从第三个字母起进行排序sort -t" " -k 2n -u a.txt # 以第二域进行排序,如果遇到重复的,就删除}
vim编辑器{
gconf-editor # 配置编辑器
/etc/vimrc # 配置文件路径vim +24 file # 打开文件定位到指定行vim file1 file2 # 打开多个文件vim -r file # 恢复上次异常关闭的文件 .file.swp vim -O2 file1 file2 # 垂直分屏vim -on file1 file2 # 水平分屏Ctrl+ U # 向前翻页Ctrl+ D # 向后翻页Ctrl+ww # 在窗口间切换Ctrl+w +or-or= # 增减高度:sp filename # 上下分割打开新文件:vs filename # 左右分割打开新文件:set nu # 打开行号:set nonu # 取消行号:nohl # 取消高亮:set paste # 取消缩进:set autoindent # 设置自动缩进:set ff # 查看文本格式:set binary # 改为unix格式:%s/str/newstr/g # 全部替换:200 # 跳转到200 1 文件头G # 跳到行尾dd # 删除当前行 并复制 可直接p粘贴11111dd # 删除11111行,可用来清空文件r # 替换单个字符R # 替换多个字符u # 撤销上次操作* # 全文匹配当前光标所在字符串$ # 行尾0 # 行首X # 文档加密v = # 自动格式化代码Ctrl+v # 可视模式Ctrl+v I ESC # 多行操作Ctrl+v s ESC # 批量取消注释}
归档解压缩{
tar zxvpf gz.tar.gz dir # 解包指定tar.gz中的内容 不指定目录则全解压
tar zcvpf /$path/gz.tar.gz * # 打包gz 注意*最好用相对路径tar zcf /$path/gz.tar.gz * # 打包正确不提示tar ztvpf gz.tar.gz # 查看gztar xvf 1.tar -C dir # 解包tar 放到指定目录tar -cvf 1.tar * # 打包tartar tvf 1.tar # 查看tartar -rvf 1.tar filename # 给tar追加文件tar --exclude=/home/dmtsai --exclude=*.tar -zcvf myfile.tar.gz /home/* /etc # 打包/home, /etc ,但排除 /home/dmtsaitar -N "2005/06/01" -zcvf home.tar.gz /home # 在 /home 当中,比 2005/06/01 新的文件才备份tar -zcvfh home.tar.gz /home # 打包目录中包括连接目录tar zcf - ./ | ssh root@IP "tar zxf - -C /xxxx" # 一边压缩一边解压zgrep str 1.gz # 查看压缩包中文件字符行bzip2 -dv 1.tar.bz2 # 解压bzip2bzip2 -v 1.tar # bzip2压缩bzcat # 查看bzip2gzip A # 直接压缩文件 # 压缩后源文件消失gunzip A.gz # 直接解压文件 # 解压后源文件消失gzip -dv 1.tar.gz # 解压gzip到targzip -v 1.tar # 压缩tar到gzunzip zip.zip # 解压zipzip zip.zip * # 压缩ziprar a rar.rar *.jpg # 压缩文件为rar包unrar x rar.rar # 解压rar包}
svn更新代码{
--force # 强制覆盖
/usr/bin/svn --username user --password passwd co $Code ${SvnPath}src/ # 检出整个项目/usr/bin/svn --username user --password passwd up $Code ${SvnPath}src/ # 更新项目/usr/bin/svn --username user --password passwd export $Code$File ${SvnPath}src/$File # 导出个别文件/usr/bin/svn --username user --password passwd export -r 版本号 svn路径 本地路径 --force # 导出指定版本}
git{
git clone git@10.10.10.10:gittest.git ./gittest/ # 克隆项目到指定目录
git clone -b develop --depth=1 http://git.a.com/d.git # 克隆指定分支 克隆一层git status # Show the working tree(工作树) statusgit log -n 1 --stat # 查看最后一次日志文件git branch -a # 列出远程跟踪分支(remote-tracking branches)和本地分支git checkout developing # 切换到developing分支git checkout -b release # 切换分支没有从当前分支创建git checkout -b release origin/master # 从远程分支创建本地镜像分支git push origin --delete release # 从远端删除分区,服务端有可能设置保护不允许删除git push origin release # 把本地分支提交到远程git pull # 更新项目 需要cd到项目目录中git fetch -f -p # 抓取远端代码但不合并到当前git reset --hard origin/master # 和远端同步分支git add . # 更新所有文件git commit -m "gittest up" # 提交操作并添加备注git push # 正式提交到远程git服务器git push [-u origin master] # 正式提交到远程git服务器(master分支)git tag [-a] dev-v-0.11.54 [-m 'fix #67'] # 创建tag,名为dev-v-0.11.54,备注fix #67git tag -l dev-v-0.11.54 # 查看tag(dev-v-0.11.5)git push origin --tags # 提交taggit reset --hard # 本地恢复整个项目git rm -r -n --cached ./img # -n执行命令时,不会删除任何文件,而是展示此命令要删除的文件列表预览git rm -r --cached ./img # 执行删除命令 需要commit和push让远程生效git init --bare smc-content-check.git # 初始化新git项目 需要手动创建此目录并给git用户权限 chown -R git:git smc-content-check.gitgit config --global credential.helper store # 记住密码git config [--global] user.name "your name" # 设置你的用户名, 希望在一个特定的项目中使用不同的用户或e-mail地址, 不要--global选项git config [--global] user.email "your email" # 设置你的e-mail地址, 每次Git提交都会使用该信息git config [--global] user.name # 查看用户名git config [--global] user.email # 查看用户e-mailgit config --global --edit # 编辑~/.gitconfig(User-specific)配置文件, 值优先级高于/etc/gitconfig(System-wide)git config --edit # 编辑.git/config(Repository specific)配置文件, 值优先级高于~/.gitconfiggit cherry-pick <commit id> # 用于把另一个本地分支的commit修改应用到当前分支 需要push到远程git log --pretty=format:'%h: %s' 9378b62..HEAD # 查看指定范围更新操作 commit idgit config --global core.ignorecase false # 设置全局大小写敏感git ls-remote --heads origin refs/heads/test # 查看从远端拉一份新的{
# You have not concluded your merge (MERGE_HEAD exists) git拉取失败git fetch --hard origin/mastergit reset --hard origin/master}删除远程分支并新建{
git checkout mastergit branch -r -d origin/test # 删除远程分支 但有时候并没有删除 可以尝试使用下面的语句git push origin :test # 推送一个空分支到远程分支,相当于删除远程分支git branch -d test # 删除本地test分支, -D 强制git branch -a |grep testgit checkout -b testgit push origin testgit reset --hard origin/test
}迁移git项目{
git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; donegit fetch --allgit pull --allgit remote set-url origin git@git.github.cn:server/gw.gitgit push --all}}恢复rm删除的文件{
# debugfs针对 ext2 # ext3grep针对 ext3 # extundelete针对 ext4
df -T # 首先查看磁盘分区格式umount /data/ # 卸载挂载,数据丢失请首先卸载挂载,或重新挂载只读ext3grep /dev/sdb1 --ls --inode 2 # 记录信息继续查找目录下文件inode信息ext3grep /dev/sdb1 --ls --inode 131081 # 此处是inodeext3grep /dev/sdb1 --restore-inode 49153 # 记录下inode信息开始恢复目录}
rpm{
rpm -ivh lynx # rpm安装
rpm -e lynx # 卸载包rpm -e lynx --nodeps # 强制卸载rpm -qa # 查看所有安装的rpm包rpm -qa | grep lynx # 查找包是否安装rpm -ql # 软件包路径rpm -Uvh # 升级包rpm --test lynx # 测试rpm -qc # 软件包配置文档rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 # 导入rpm的签名信息rpm --initdb # 初始化rpm 数据库rpm --rebuilddb # 重建rpm数据库 在rpm和yum无响应的情况使用 先 rm -f /var/lib/rpm/__db.00* 在重建}
yum{
yum list # 所有软件列表
yum install 包名 # 安装包和依赖包yum -y update # 升级所有包版本,依赖关系,系统版本内核都升级yum -y update 软件包名 # 升级指定的软件包yum -y upgrade # 不改变软件设置更新软件,系统版本升级,内核不改变yum search mail # yum搜索相关包yum grouplist # 软件包组yum -y groupinstall "Virtualization" # 安装软件包组repoquery -ql gstreamer # 不安装软件查看包含文件yum clean all # 清除var下缓存}
yum使用epel源{
# 包下载地址: http://download.fedoraproject.org/pub/epel # 选择版本5\6\7
rpm -Uvh http://mirrors.hustunique.com/epel//6/x86_64/epel-release-6-8.noarch.rpm# 自适配版本
yum install epel-release}
自定义yum源{
find /etc/yum.repos.d -name "*.repo" -exec mv {} {}.bak \;
vim /etc/yum.repos.d/yum.repo
[yum]#httpbaseurl=http://10.0.0.1/centos5.5#挂载iso#mount -o loop CentOS-5.8-x86_64-bin-DVD-1of2.iso /data/iso/#本地#baseurl=file:///data/iso/enable=1#导入key
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5}
源码安装{
./configure --help # 查看所有编译参数
./configure --prefix=/usr/local/ # 配置参数make # 编译# make -j 8 # 多线程编译,速度较快,但有些软件不支持make install # 安装包make clean # 清除编译结果}
开机启动脚本顺序{
/etc/profile
/etc/profile.d/*.sh~/bash_profile~/.bashrc/etc/bashrc}
进程管理{
ps -eaf # 查看所有进程
kill -9 PID # 强制终止某个PID进程kill -15 PID # 安全退出 需程序内部处理信号cmd & # 命令后台运行nohup cmd & # 后台运行不受shell退出影响ctrl+z # 将前台放入后台(暂停)jobs # 查看后台运行程序bg 2 # 启动后台暂停进程fg 2 # 调回后台进程pstree # 进程树vmstat 1 9 # 每隔一秒报告系统性能信息9次sar # 查看cpu等状态lsof file # 显示打开指定文件的所有进程lsof -i:32768 # 查看端口的进程renice +1 180 # 把180号进程的优先级加1exec sh a.sh # 子进程替换原来程序的pid, 避免supervisor无法强制杀死进程ps{
ps aux |grep -v USER | sort -nk +4 | tail # 显示消耗内存最多的10个运行中的进程,以内存使用量排序.cpu +3
# USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND%CPU # 进程的cpu占用率%MEM # 进程的内存占用率VSZ # 进程虚拟大小,单位K(即总占用内存大小,包括真实内存和虚拟内存)RSS # 进程使用的驻留集大小即实际物理内存大小START # 进程启动时间和日期占用的虚拟内存大小 = VSZ - RSSps -eo pid,lstart,etime,args # 查看进程启动时间
}
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% hi0.0% si第四、五行:为内存信息。内容如下:
Mem: 191272k total 物理内存总量173656k used 使用的物理内存总量17616k free 空闲内存总量22052k buffers 用作内核缓存的内存量Swap: 192772k total 交换区总量0k used 使用的交换区总量192772k free 空闲交换区总量123988k cached 缓冲的交换区总量。内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,该数值即为这些内容已存在于内存中的交换区的大小。相应的内存再次被换出时可不必再对交换区写入。进程信息区,各列的含义如下: # 显示各个进程的详细信息
序号 列名 含义
a PID 进程idb PPID 父进程idc RUSER Real user named UID 进程所有者的用户ide 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+RESp SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。q RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATAr CODE 可执行代码占用的物理内存大小,单位kbs DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kbt SHR 共享内存大小,单位kbu nFLT 页面错误次数v nDRT 最后一次写入到现在,被修改过的页面数。w S 进程状态。D=不可中断的睡眠状态R=运行S=睡眠T=跟踪/停止Z=僵尸进程 父进程在但并不等待子进程x COMMAND 命令名/命令行y WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名z Flags 任务标志,参考 sched.h}
列出正在占用swap的进程{
#!/bin/bash
echo -e "PID\t\tSwap\t\tProc_Name"# 拿出/proc目录下所有以数字为名的目录(进程名是数字才是进程,其他如sys,net等存放的是其他信息)for pid in `ls -l /proc | grep ^d | awk '{ print $9 }'| grep -v [^0-9]`do# 让进程释放swap的方法只有一个:就是重启该进程。或者等其自动释放。放# 如果进程会自动释放,那么我们就不会写脚本来找他了,找他都是因为他没有自动释放。# 所以我们要列出占用swap并需要重启的进程,但是init这个进程是系统里所有进程的祖先进程# 重启init进程意味着重启系统,这是万万不可以的,所以就不必检测他了,以免对系统造成影响。if [ $pid -eq 1 ];then continue;figrep -q "Swap" /proc/$pid/smaps 2>/dev/nullif [ $? -eq 0 ];thenswap=$(grep Swap /proc/$pid/smaps \| gawk '{ sum+=$2;} END{ print sum }')proc_name=$(ps aux | grep -w "$pid" | grep -v grep \| awk '{ for(i=11;i<=NF;i++){ printf("%s ",$i); }}')if [ $swap -gt 0 ];thenecho -e "${pid}\t${swap}\t${proc_name}"fifidone | sort -k2 -n | awk -F'\t' '{ pid[NR]=$1;size[NR]=$2;name[NR]=$3;}END{ for(id=1;id<=length(pid);id++){ if(size[id]<1024)printf("%-10s\t%15sKB\t%s\n",pid[id],size[id],name[id]);else if(size[id]<1048576)printf("%-10s\t%15.2fMB\t%s\n",pid[id],size[id]/1024,name[id]);elseprintf("%-10s\t%15.2fGB\t%s\n",pid[id],size[id]/1048576,name[id]);}}'}
linux操作系统提供的信号{
kill -l # 查看linux提供的信号
trap "echo aaa" 2 3 15 # shell使用 trap 捕捉退出信号# 发送信号一般有两种原因:
# 1(被动式) 内核检测到一个系统事件.例如子进程退出会像父进程发送SIGCHLD信号.键盘按下control+c会发送SIGINT信号# 2(主动式) 通过系统调用kill来向指定进程发送信号# 进程结束信号 SIGTERM 和 SIGKILL 的区别: SIGTERM 比较友好,进程能捕捉这个信号,根据您的需要来关闭程序。在关闭程序之前,您可以结束打开的记录文件和完成正在做的任务。在某些情况下,假如进程正在进行作业而且不能中断,那么进程可以忽略这个SIGTERM信号。# 如果一个进程收到一个SIGUSR1信号,然后执行信号绑定函数,第二个SIGUSR2信号又来了,第一个信号没有被处理完毕的话,第二个信号就会丢弃。SIGHUP 1 A # 终端挂起或者控制进程终止
SIGINT 2 A # 键盘终端进程(如control+c)SIGQUIT 3 C # 键盘的退出键被按下SIGILL 4 C # 非法指令SIGABRT 6 C # 由abort(3)发出的退出指令SIGFPE 8 C # 浮点异常SIGKILL 9 AEF # Kill信号 立刻停止SIGSEGV 11 C # 无效的内存引用SIGPIPE 13 A # 管道破裂: 写一个没有读端口的管道SIGALRM 14 A # 闹钟信号 由alarm(2)发出的信号SIGTERM 15 A # 终止信号,可让程序安全退出 kill -15SIGUSR1 30,10,16 A # 用户自定义信号1SIGUSR2 31,12,17 A # 用户自定义信号2SIGCHLD 20,17,18 B # 子进程结束自动向父进程发送SIGCHLD信号SIGCONT 19,18,25 # 进程继续(曾被停止的进程)SIGSTOP 17,19,23 DEF # 终止进程SIGTSTP 18,20,24 D # 控制终端(tty)上按下停止键SIGTTIN 21,21,26 D # 后台进程企图从控制终端读SIGTTOU 22,22,27 D # 后台进程企图从控制终端写缺省处理动作一项中的字母含义如下:
A 缺省的动作是终止进程B 缺省的动作是忽略此信号,将该信号丢弃,不做处理C 缺省的动作是终止进程并进行内核映像转储(dump core),内核映像转储是指将进程数据在内存的映像和进程在内核结构中的部分内容以一定格式转储到文件系统,并且进程退出执行,这样做的好处是为程序员提供了方便,使得他们可以得到进程当时执行时的数据值,允许他们确定转储的原因,并且可以调试他们的程序。D 缺省的动作是停止进程,进入停止状况以后还能重新进行下去,一般是在调试的过程中(例如ptrace系统调用)E 信号不能被捕获F 信号不能被忽略}系统性能状态{
vmstat 1 9
r # 等待执行的任务数。当这个值超过了cpu线程数,就会出现cpu瓶颈。
b # 等待IO的进程数量,表示阻塞的进程。swpd # 虚拟内存已使用的大小,如大于0,表示机器物理内存不足,如不是程序内存泄露,那么该升级内存。free # 空闲的物理内存的大小buff # 已用的buff大小,对块设备的读写进行缓冲cache # cache直接用来记忆我们打开的文件,给文件做缓冲,(把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)inact # 非活跃内存大小,即被标明可回收的内存,区别于free和active -a选项时显示active # 活跃的内存大小 -a选项时显示si # 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露,要查找耗内存进程解决掉。so # 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。bi # 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024bytebo # 块设备每秒发送的块数量,例如读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。in # 每秒CPU的中断次数,包括时间中断。in和cs这两个值越大,会看到由内核消耗的cpu时间会越多cs # 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用。us # 用户进程执行消耗cpu时间(user time) us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期超过50%的使用,那么我们就该考虑优化程序算法或其他措施sy # 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。id # 空闲 CPU时间,一般来说,id + us + sy = 100,一般认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。wt # 等待IOCPU时间。Wa过高时,说明io等待比较严重,这可能是由于磁盘大量随机访问造成的,也有可能是磁盘的带宽出现瓶颈。如果 r 经常大于4,且id经常少于40,表示cpu的负荷很重。
如果 pi po 长期不等于0,表示内存不足。如果 b 队列经常大于3,表示io性能不好。}
}
日志管理{
history # 历时命令默认1000条
HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S " # 让history命令显示具体时间history -c # 清除记录命令cat $HOME/.bash_history # 历史命令记录文件lastb -a # 列出登录系统失败的用户相关信息 清空二进制日志记录文件 echo > /var/log/btmplast # 查看登陆过的用户信息 清空二进制日志记录文件 echo > /var/log/wtmp 默认打开乱码who /var/log/wtmp # 查看登陆过的用户信息lastlog # 用户最后登录的时间tail -f /var/log/messages # 系统日志tail -f /var/log/secure # ssh日志}
selinux{
sestatus -v # 查看selinux状态
getenforce # 查看selinux模式setenforce 0 # 设置selinux为宽容模式(可避免阻止一些操作)semanage port -l # 查看selinux端口限制规则semanage port -a -t http_port_t -p tcp 8000 # 在selinux中注册端口类型vi /etc/selinux/config # selinux配置文件SELINUX=enfoceing # 关闭selinux 把其修改为 SELINUX=disabled}
查看剩余内存{
free -m
#-/+ buffers/cache: 6458 1649#6458M为真实使用内存 1649M为真实剩余内存(剩余内存+缓存+缓冲器)#linux会利用所有的剩余内存作为缓存,所以要保证linux运行速度,就需要保证内存的缓存大小}
查看剩余内存{free -m
#-/+ buffers/cache: 6458 1649#6458M为真实使用内存 1649M为真实剩余内存(剩余内存+缓存+缓冲器)#linux会利用所有的剩余内存作为缓存,所以要保证linux运行速度,就需要保证内存的缓存大小}
系统信息{
uname -a # 查看Linux内核版本信息
cat /proc/version # 查看内核版本cat /etc/issue # 查看系统版本lsb_release -a # 查看系统版本 需安装 centos-releaselocale -a # 列出所有语系locale # 当前环境变量中所有编码hwclock # 查看时间who # 当前在线用户w # 当前在线用户whoami # 查看当前用户名logname # 查看初始登陆用户名uptime # 查看服务器启动时间sar -n DEV 1 10 # 查看网卡网速流量dmesg # 显示开机信息lsmod # 查看内核模块}
终端提示显示{
echo $PS1 # 环境变量控制提示显示
PS1='[\u@ \H \w \A \@#]\$'PS1='[\u@\h \W]\$'export PS1='[\[\e[32m\]\[\e[31m\]\u@\[\e[36m\]\h \w\[\e[m\]]\$ ' # 高亮显示终端}
开机启动模式{
vi /etc/inittab
id:3:initdefault: # 3为多用户命令#ca::ctrlaltdel:/sbin/shutdown -t3 -r now # 注释此行 禁止 ctrl+alt+del 关闭计算机}
硬件信息{
more /proc/cpuinfo # 查看cpu信息
lscpu # 查看cpu信息cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c # 查看cpu型号和逻辑核心数getconf LONG_BIT # cpu运行的位数cat /proc/cpuinfo | grep 'physical id' |sort| uniq -c # 物理cpu个数cat /proc/cpuinfo | grep flags | grep ' lm ' | wc -l # 结果大于0支持64位cat /proc/cpuinfo|grep flags # 查看cpu是否支持虚拟化 pae支持半虚拟化 IntelVT 支持全虚拟化more /proc/meminfo # 查看内存信息dmidecode # 查看全面硬件信息dmidecode | grep "Product Name" # 查看服务器型号dmidecode | grep -P -A5 "Memory\s+Device" | grep Size | grep -v Range # 查看内存插槽cat /proc/mdstat # 查看软raid信息cat /proc/scsi/scsi # 查看Dell硬raid信息(IBM、HP需要官方检测工具)lspci # 查看硬件信息lspci|grep RAID # 查看是否支持raidlspci -vvv |grep Ethernet # 查看网卡型号lspci -vvv |grep Kernel|grep driver # 查看驱动模块modinfo tg2 # 查看驱动版本(驱动模块)ethtool -i em1 # 查看网卡驱动版本ethtool em1 # 查看网卡带宽}
终端快捷键{Ctrl+A # 行前
Ctrl+E # 行尾Ctrl+S # 终端锁屏Ctrl+Q # 解锁屏Ctrl+D # 退出}
定时任务{
at 5pm + 3 days /bin/ls # 单次定时任务 指定三天后下午5:00执行/bin/ls
crontab -e # 编辑周期任务
#分钟 小时 天 月 星期 命令或脚本1,30 1-3/2 * * * 命令或脚本 >> file.log 2>&1echo "40 7 * * 2 /root/sh">>/var/spool/cron/root # 直接将命令写入周期任务crontab -l # 查看自动周期性任务crontab -r # 删除自动周期性任务cron.deny和cron.allow # 禁止或允许用户使用周期任务service crond start|stop|restart # 启动自动周期性服务* * * * * echo "d" >>d$(date +\%Y\%m\%d).log # 让定时任务直接生成带日期的log 需要转义%}
date{
星期日[SUN] 星期一[MON] 星期二[TUE] 星期三[WED] 星期四[THU] 星期五[FRI] 星期六[SAT]
一月[JAN] 二月[FEB] 三月[MAR] 四月[APR] 五月[MAY] 六月[JUN] 七月[JUL] 八月[AUG] 九月[SEP] 十月[OCT] 十一月[NOV] 十二月[DEC]date -s 20091112 # 设日期
date -s 18:30:50 # 设时间date -d "7 days ago" +%Y%m%d # 7天前日期date -d "5 minute ago" +%H:%M # 5分钟前时间date -d "1 month ago" +%Y%m%d # 一个月前date -d '1 days' +%Y-%m-%d # 一天后date -d '1 hours' +%H:%M:%S # 一小时后date +%Y-%m-%d -d '20110902' # 日期格式转换date +%Y-%m-%d_%X # 日期和时间date +%N # 纳秒date -d "2012-08-13 14:00:23" +%s # 换算成秒计算(1970年至今的秒数)date -d "@1363867952" +%Y-%m-%d-%T # 将时间戳换算成日期date -d "1970-01-01 UTC 1363867952 seconds" +%Y-%m-%d-%T # 将时间戳换算成日期date -d "`awk -F. '{print $1}' /proc/uptime` second ago" +"%Y-%m-%d %H:%M:%S" # 格式化系统启动时间(多少秒前)}
limits.conf{
ulimit -SHn 65535 # 临时设置文件描述符大小 进程最大打开文件柄数 还有socket最大连接数, 等同配置 nofile
ulimit -SHu 65535 # 临时设置用户最大进程数ulimit -a # 查看/etc/security/limits.conf
# 文件描述符大小 open files
# lsof |wc -l 查看当前文件句柄数使用数量* soft nofile 16384 # 设置太大,进程使用过多会把机器拖死* hard nofile 32768# 用户最大进程数 max user processes
# echo $((`ps uxm |wc -l`-`ps ux |wc -l`)) 查看当前用户占用的进程数 [包括线程]user soft nproc 16384user hard nproc 32768# 如果/etc/security/limits.d/有配置文件,将会覆盖/etc/security/limits.conf里的配置
# 即/etc/security/limits.d/的配置文件里就不要有同样的参量设置/etc/security/limits.d/90-nproc.conf # centos6.3的默认这个文件会覆盖 limits.confuser soft nproc 16384user hard nproc 32768sysctl -p # 修改配置文件后让系统生效
}
随机分配端口范围{
# 本机连其它端口用的
echo "10000 65535" > /proc/sys/net/ipv4/ip_local_port_range}
百万长链接设置{
# 内存消耗需要较大
vim /root/.bash_profile# 添加如下2行,退出bash重新登陆# 一个进程不能使用超过NR_OPEN文件描述符echo 20000500 > /proc/sys/fs/nr_open# 当前用户最大文件数ulimit -n 10000000}
libc.so故障修复{
# 由于升级glibc导致libc.so不稳定,突然报错,幸好还有未退出的终端
grep: error while loading shared libraries: /lib64/libc.so.6: ELF file OS ABI invalid# 看看当前系统有多少版本 libc.so
ls /lib64/libc-[tab]# 更改环境变量指向其他 libc.so 文件测试
export LD_PRELOAD=/lib64/libc-2.7.so # 如果不改变LD_PRELOAD变量,ln不能用,需要使用 /sbin/sln 命令做链接# 当前如果好使了,在执行下面强制替换软链接。如不好使,测试其他版本的libc.so文件
ln -f -s /lib64/libc-2.7.so /lib64/libc.so.6}
sudo{
echo myPassword | sudo -S ls /tmp # 直接输入sudo的密码非交互,从标准输入读取密码而不是终端设备
visudo # sudo命令权限添加 /etc/sudoers用户 别名(可用all)=NOPASSWD:命令1,命令2user ALL=NOPASSWD:/bin/su # 免root密码切换root身份wangming linuxfan=NOPASSWD:/sbin/apache start,/sbin/apache restartUserName ALL=(ALL) ALLUserName ALL=(ALL) NOPASSWD: ALLpeterli ALL=(ALL) NOPASSWD:/sbin/serviceDefaults requiretty # sudo不允许后台运行,注释此行既允许Defaults !visiblepw # sudo不允许远程,去掉!既允许}
服务{
/etc/init.d/sendmail start # 启动服务
/etc/init.d/sendmail stop # 关闭服务/etc/init.d/sendmail status # 查看服务当前状态/date/mysql/bin/mysqld_safe --user=mysql & # 启动mysql后台运行/bin/systemctl restart mysqld.service # centos7启动服务vi /etc/rc.d/rc.local # 开机启动执行 可用于开机启动脚本/etc/rc.d/rc3.d/S55sshd # 开机启动和关机关闭服务连接 # S开机start K关机stop 55级别 后跟服务名ln -s -f /date/httpd/bin/apachectl /etc/rc.d/rc3.d/S15httpd # 将启动程序脚本连接到开机启动目录ipvsadm -ln # lvs查看后端负载机并发ipvsadm -C # lvs清除规则xm list # 查看xen虚拟主机列表virsh # 虚拟化(xen\kvm)管理工具 yum groupinstall Virtual*./bin/httpd -M # 查看httpd加载模块httpd -t -D DUMP_MODULES # rpm包httpd查看加载模块echo 内容| /bin/mail -s "标题" 收件箱 -f 发件人 # 发送邮件"`echo "内容"|iconv -f utf8 -t gbk`" | /bin/mail -s "`echo "标题"|iconv -f utf8 -t gbk`" 收件箱 # 解决邮件乱码/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg # 检测nagios配置文件chkconfig{
chkconfig service on|off|set # 设置非独立服务启状态
chkconfig --level 35 httpd off # 让服务不自动启动chkconfig --level 35 httpd on # 让服务自动启动 35指的是运行级别chkconfig --list # 查看所有服务的启动状态chkconfig --list |grep httpd # 查看某个服务的启动状态chkconfig –-list [service] # 查看服务的状态}
systemctl{
systemctl is-active *.service # 查看服务是否运行
systemctl is-enabled *.service # 查询服务是否开机启动systemctl mask *.service # 注销指定服务systemctl unmask cups.service # 取消注销cups服务systemctl enable *.service # 开机运行服务systemctl disable *.service # 取消开机运行systemctl start *.service # 启动服务systemctl stop *.service # 停止服务systemctl restart *.service # 重启服务systemctl reload *.service # 重新加载服务配置文件systemctl status *.service # 查询服务运行状态systemctl --failed # 显示启动失败的服务systemctl poweroff # 系统关机systemctl reboot # 重新启动systemctl rescue # 强制进入救援模式systemctl emergency # 强制进入紧急救援模式systemctl list-dependencies # 查看当前运行级别target(mult-user)启动了哪些服务systemctl list-unit-files # 查看开机启动的状态journalctl -r -u elasticsearch.service # 查看日志 r倒序 u服务名/etc/systemd/system/falcon-agent.service[Unit]Description=This is zuiyou monitor agentAfter=network.target remote-fs.target nss-lookup.target[Service]
User= rootType=simplePIDFile=/opt/falcon-agent/var/app.pidExecStartPre=/usr/bin/rm -f /opt/falcon-agent/var/app.pidExecStart=/opt/falcon-agent/control startExecReload=/bin/kill -s HUP $MAINPIDKillMode=processKillSignal=SIGQUITTimeoutStopSec=5PrivateTmp=trueRestart=alwaysLimitNOFILE=infinity[Install]
WantedBy=multi-user.targetsystemctl daemon-reload # 加载配置
}
}
nginx{
yum install -y make gcc openssl-devel pcre-devel bzip2-devel libxml2 libxml2-devel curl-devel libmcrypt-devel libjpeg libjpeg-devel libpng libpng-devel openssl
groupadd nginx
useradd nginx -g nginx -M -s /sbin/nologinmkdir -p /opt/nginx-tmp
wget http://labs.frickle.com/files/ngx_cache_purge-1.6.tar.gz
tar fxz ngx_cache_purge-1.6.tar.gz# ngx_cache_purge 清除指定url缓存# 假设一个URL为 http://192.168.12.133/test.txt# 通过访问 http://192.168.12.133/purge/test.txt 就可以清除该URL的缓存。tar zxvpf nginx-1.4.4.tar.gz
cd nginx-1.4.4# ./configure --help
# --with # 默认不加载 需指定编译此参数才使用# --without # 默认加载,可用此参数禁用# --add-module=path # 添加模块的路径# --add-module=/opt/ngx_module_upstream_check \ # nginx 代理状态页面# ngx_module_upstream_check 编译前需要打对应版本补丁 patch -p1 < /opt/nginx_upstream_check_module/check_1.2.6+.patch# --add-module=/opt/ngx_module_memc \ # 将请求页面数据存放在 memcached中# --add-module=/opt/ngx_module_lua \ # 支持lua脚本 yum install lua-devel lua./configure \
--user=nginx \--group=nginx \--prefix=/usr/local/nginx \--with-http_ssl_module \--with-http_realip_module \--with-http_gzip_static_module \--with-http_stub_status_module \--add-module=/opt/ngx_cache_purge-1.6 \--http-client-body-temp-path=/opt/nginx-tmp/client \--http-proxy-temp-path=/opt/nginx-tmp/proxy \--http-fastcgi-temp-path=/opt/nginx-tmp/fastcgi \--http-uwsgi-temp-path=/opt/nginx-tmp/uwsgi \--http-scgi-temp-path=/opt/nginx-tmp/scgimake && make install
/usr/local/nginx/sbin/nginx –t # 检查Nginx配置文件 但并不执行
/usr/local/nginx/sbin/nginx -t -c /opt/nginx/conf/nginx.conf # 检查Nginx配置文件/usr/local/nginx/sbin/nginx # 启动nginx/usr/local/nginx/sbin/nginx -s reload # 重载配置/usr/local/nginx/sbin/nginx -s stop # 关闭nginx服务}
elasticsearch{
vim /etc/sysctl.conf
vm.max_map_count = 262144vim /etc/security/limits.conf
* soft memlock unlimited* hard memlock unlimitedsysctl -pcurl 'localhost:9200/_cat/health?v' # 健康检查
curl 'localhost:9200/_cat/nodes?v' # 获取集群的节点列表curl 'localhost:9200/_cat/indices?v' # 列出所有索引curl 127.0.0.1:9200/indexname -XDELETE # 删除索引curl -XGET http://localhost:9200/_cat/shards # 查看分片curl '127.0.0.1:9200/_cat/indices' # 查分片同步 unassigned_shards # 没同步完成}
mysql常用命令{
# mysql 可视化工具 MySQL Workbench
mysqlcheck -uroot -p -S mysql.sock --optimize --databases account # 检查、修复、优化MyISAM表
mysqlbinlog slave-relay-bin.000001 # 查看二进制日志mysqladmin -h myhost -u root -p create dbname # 创建数据库flush privileges; # 刷新
show databases; # 显示所有数据库use dbname; # 打开数据库show tables; # 显示选中数据库中所有的表desc tables; # 查看表结构drop database name; # 删除数据库drop table name; # 删除表create database name; # 创建数据库select column from table; # 查询show processlist; # 查看mysql进程show full processlist; # 显示进程全的语句select user(); # 查看所有用户show slave status\G; # 查看主从状态show variables; # 查看所有参数变量show status; # 运行状态show table status # 查看表的引擎状态show grants for user@'%' # 查看用户权限drop table if exists user # 表存在就删除create table if not exists user # 表不存在就创建select host,user,password from user; # 查询用户权限 先use mysqlcreate table ka(ka_id varchar(6),qianshu int); # 创建表show variables like 'character_set_%'; # 查看系统的字符集和排序方式的设定show variables like '%timeout%'; # 查看超时相关参数delete from user where user=''; # 删除空用户delete from user where user='sss' and host='localhost' ; # 删除用户drop user 'sss'@'localhost'; # 使用此方法删除用户更为靠谱ALTER TABLE mytable ENGINE = MyISAM ; # 改变现有的表使用的存储引擎SHOW TABLE STATUS from dbname where Name='tablename'; # 查询表引擎mysql -uroot -p -A -ss -h10.10.10.5 -e "show databases;" # shell中获取数据不带表格 -ss参数CREATE TABLE innodb (id int, title char(20)) ENGINE = INNODB # 创建表指定存储引擎的类型(MyISAM或INNODB)grant replication slave on *.* to 'user'@'%' identified by 'pwd'; # 创建主从复制用户ALTER TABLE player ADD INDEX weekcredit_faction_index (weekcredit, faction); # 添加索引alter table name add column accountid(column) int(11) NOT NULL(column); # 插入字段update host set monitor_state='Y',hostname='xuesong' where ip='192.168.1.1'; # 更新数据select * from information_schema.processlist where command!='sleep'; # 查看当前进程select * from atable where name='on' AND t<15 AND host LIKE '10%' limit 1,10; # 多条件查询show create database ops_deploy; # 查看数据库编码show create table updatelog; # 查看数据库表编码alter database ops_deploy CHARACTER SET utf8; # 修改数据库编码alter table `updatelog` default character set utf8; # 修改表编码alter table `updatelog` convert to character set utf8; # 修改一张表的所有字段的编码格式自增表{
create table xuesong (id INTEGER PRIMARY KEY AUTO_INCREMENT, name CHAR(30) NOT NULL, age integer , sex CHAR(15) ); # 创建自增表
insert into xuesong(name,age,sex) values(%s,%s,%s) # 自增插入数据}
登录mysql的命令{
# 格式: mysql -h 主机地址 -u 用户名 -p 用户密码
mysql -h110.110.110.110 -P3306 -uroot -pmysql -uroot -p -S /data1/mysql5/data/mysql.sock -A --default-character-set=GBK}
shell执行mysql命令{
mysql -u root -p'123' xuesong < file.sql # 针对指定库执行sql文件中的语句,好处不需要转义特殊符号,一条语句可以换行.不指定库执行时语句中需要先use
mysql -u$username -p$passwd -h$dbhost -P$dbport -A -e "use $dbname;delete from data where date=('$date1');" # 执行多条mysql命令mysql -uroot -p -S mysql.sock -e "use db;alter table gift add column accountid int(11) NOT NULL;flush privileges;" 2>&1 |grep -v Warning # 不登陆mysql插入字段}
mysql字符集相关{show variables like '%character%'; # 查看数据库中设置字符集的参数
# character_set_client、character_set_connection 以及 character_set_results 这几个参数都是客户端的设置# character_set_system、character_set_server 以及 character_set_database 是指服务器端的设置。# 而对于这三个服务器端的参数来说的优先级是:# 列级字符集 > 表级字符集 > character_set_database > character_set_server > character_set_systemshow global variables like '%char%'; #查看RDS实例字符集相关参数设置
show global variables like 'coll%'; #查看当前会话字符序相关参数设置show character set; #查看实例支持的字符集show collation; #查看实例支持的字符序show create table table_name \G #查看表字符集设置show create database database_name \G #查看数据库字符集设置show create procedure procedure_name \G #查看存储过程字符集设置show procedure status \G #查看存储过程字符集设置alter database db_name default charset utf8; #修改数据库的字符集 create database db_name character set utf8; #创建数据库时指定字符集alter table tab_name default charset utf8 collate utf8_general_ci; #修改表字符集和字符序# 下面三条sql 分别将库 dbsdq , 表 tt2 , 表 tt2 中的 c2 列修改为utf8mb4 字符集
alter database dbsdq character set utf8mb4 collate utf8mb4_unicode_ci;use dbsdq;alter table tt2 character set utf8mb4 collate utf8mb4_unicode_ci;alter table tt2 modify c2 varchar(10) character set utf8mb4;# 修改列时,当前列中的所有行都会立即转化为新的字符集;# alter table 会对表加元数据锁}
备份数据库{
mysqldump -h host -u root -p --default-character-set=utf8 dbname >dbname_backup.sql # 不包括库名,还原需先创建库,在use
mysqldump -h host -u root -p --database --default-character-set=utf8 dbname >dbname_backup.sql # 包括库名,还原不需要创建库/bin/mysqlhotcopy -u root -p # mysqlhotcopy只能备份MyISAM引擎mysqldump -u root -p -S mysql.sock --default-character-set=utf8 dbname table1 table2 > /data/db.sql # 备份表mysqldump -uroot -p123 -d database > database.sql # 备份数据库结构# 最小权限备份
grant select on db_name.* to dbbackup@"localhost" Identified by "passwd";# --single-transaction InnoDB有时间戳 只备份开始那一刻的数据,备份过程中的数据不会备份mysqldump -hlocalhost -P 3306 -u dbbackup --single-transaction -p"passwd" --database dbname >dbname.sql# xtrabackup备份需单独安装软件 优点: 速度快,压力小,可直接恢复主从复制
innobackupex --user=root --password="" --defaults-file=/data/mysql5/data/my_3306.cnf --socket=/data/mysql5/data/mysql.sock --slave-info --stream=tar --tmpdir=/data/dbbackup/temp /data/dbbackup/ 2>/data/dbbackup/dbbackup.log | gzip 1>/data/dbbackup/db50.tar.gz}
还原数据库{
mysql -h host -u root -p dbname < dbname_backup.sql
source 路径.sql # 登陆mysql后还原sql文件}
赋权限{
# 指定IP: $IP 本机: localhost 所有IP地址: % # 通常指定多条
grant all on zabbix.* to user@"$IP"; # 对现有账号赋予权限grant select on database.* to user@"%" Identified by "passwd"; # 赋予查询权限(没有用户,直接创建)grant all privileges on database.* to user@"$IP" identified by 'passwd'; # 赋予指定IP指定用户所有权限(不允许对当前库给其他用户赋权限)grant all privileges on database.* to user@"localhost" identified by 'passwd' with grant option; # 赋予本机指定用户所有权限(允许对当前库给其他用户赋权限)grant select, insert, update, delete on database.* to user@'ip'identified by "passwd"; # 开放管理操作指令revoke all on *.* from user@localhost; # 回收权限GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, EXECUTE, CREATE ROUTINE, ALTER ROUTINE ON `storemisc_dev`.* TO 'user'@'192.168.%'}
更改密码{
update user set password=password('passwd') where user='root'
mysqladmin -u root password 'xuesong'}
mysql忘记密码后重置{
cd /data/mysql5
/data/mysql5/bin/mysqld_safe --user=mysql --skip-grant-tables --skip-networking &use mysql;update user set password=password('123123') where user='root';}
mysql主从复制失败恢复{
slave stop;
reset slave;change master to master_host='10.10.10.110',master_port=3306,master_user='repl',master_password='repl',master_log_file='master-bin.000010',master_log_pos=107,master_connect_retry=60;slave start;}
sql语句使用变量{
use xuesong;
set @a=concat('my',weekday(curdate())); # 组合时间变量set @sql := concat('CREATE TABLE IF NOT EXISTS ',@a,'( id INT(11) NOT NULL )'); # 组合sql语句select @sql; # 查看语句prepare create_tb from @sql; # 准备execute create_tb; # 执行}
检测mysql主从复制延迟{
1、在从库定时执行更新主库中的一个timeout数值
2、同时取出从库中的timeout值对比判断从库与主库的延迟}
死锁{
show OPEN TABLES where In_use > 0; # 查看当前锁信息
show variables like 'innodb_print_all_deadlocks'; # 查看当前死锁参数set global innodb_print_all_deadlocks = 1; # 设置死锁信息保存到错误日志innodb_print_all_deadlocks = 1 # conf配置}
mysql慢查询{
select * from information_schema.processlist where command in ('Query') and time >5\G # 查询操作大于5S的进程
开启慢查询日志{
# 配置文件 /etc/my.conf
[mysqld]log-slow-queries=/var/lib/mysql/slowquery.log # 指定日志文件存放位置,可以为空,系统会给一个缺省的文件host_name-slow.loglong_query_time=5 # 记录超过的时间,默认为10s 建议0.5Slog-queries-not-using-indexes # log下来没有使用索引的query,可以根据情况决定是否开启 可不加log-long-format # 如果设置了,所有没有使用索引的查询也将被记录 可不加# 直接修改生效show variables like "%slow%"; # 查看慢查询状态set global slow_query_log='ON'; # 开启慢查询日志 变量可能不同,看上句查询出来的变量}
mysqldumpslow慢查询日志查看{
-s # 是order的顺序,包括看了代码,主要有 c,t,l,r和ac,at,al,ar,分别是按照query次数,时间,lock的时间和返回的记录数来排序,前面加了a的时倒序
-t # 是top n的意思,即为返回前面多少条的数据-g # 后边可以写一个正则匹配模式,大小写不敏感的mysqldumpslow -s c -t 20 host-slow.log # 访问次数最多的20个sql语句
mysqldumpslow -s r -t 20 host-slow.log # 返回记录集最多的20个sqlmysqldumpslow -t 10 -s t -g "left join" host-slow.log # 按照时间返回前10条里面含有左连接的sql语句show global status like '%slow%'; # 查看现在这个session有多少个慢查询
show variables like '%slow%'; # 查看慢查询日志是否开启,如果slow_query_log和log_slow_queries显示为on,说明服务器的慢查询日志已经开启show variables like '%long%'; # 查看超时阀值desc select * from wei where text='xishizhaohua'\G; # 扫描整张表 tepe:ALL 没有使用索引 key:NULLcreate index text_index on wei(text); # 创建索引}
Percona Toolkit 慢日志分析工具
}
mysql操作次数查询{
select * from information_schema.global_status;
com_select
com_deletecom_insertcom_update}
}
JDK安装{vim /etc/profile.d/jdk.sh
export JAVA_HOME=/usr/local/jdk1.8.0_151export PATH=$JAVA_HOME/bin:$PATH. /etc/profile # 加载新的环境变量
jps -ml # 查看java进程}redis动态加内存{
./redis-cli -h 10.10.10.11 -p 6401
save # 保存当前快照config get * # 列出所有当前配置config get maxmemory # 查看指定配置config set maxmemory 15360000000 # 动态修改最大内存配置参数}
nfs{
# 依赖rpc服务通信 portmap[centos5] 或 rpcbind[centos6]
yum install nfs-utils portmap # centos5安装yum install nfs-utils rpcbind # centos6安装vim /etc/exports # 配置文件
# sync # 同步写入# async # 暂存并非直接写入# no_root_squash # 开放用户端使用root身份操作# root_squash # 使用者身份为root则被压缩成匿名使用,即nobody,相对安全# all_squash # 所有NFS的使用者身份都被压缩为匿名/data/images 10.10.10.0/24(rw,sync,no_root_squash)service portmap restart # 重启centos5的nfs依赖的rpc服务
service rpcbind restart # 重启centos6的nfs依赖的rpc服务service nfs restart # 重启nfs服务 确保依赖 portmap 或 rpcbind 服务已启动service nfs reload # 重载NFS服务配置文件showmount -e # 服务端查看自己共享的服务showmount -a # 显示已经与客户端连接上的目录信息showmount -e 10.10.10.3 # 列出服务端可供使用的NFS共享 客户端测试能否访问nfs服务mount -t nfs 10.10.10.3:/data/images/ /data/img # 挂载nfs 如果延迟影响大加参数 noac# 服务端的 portmap 或 rpcbind 被停止后,nfs仍然工作正常,但是umout财会提示: not found / mounted or server not reachable 重启服务器的portmap 或 rpcbind 也无济于事。 nfs也要跟着重启,否则nfs工作仍然是不正常的。
# 同时已挂载会造成NFS客户端df卡住和挂载目录无法访问。请先用 mount 查看当前挂载情况,记录挂载信息,在强制卸载挂载目录,重新挂载umount -f /data/img/ # 强制卸载挂载目录 如还不可以 umount -l /data/img/nfsstat -c # 客户机发送和拒绝的RPC和NFS调用数目的信息
nfsstat -cn # 显示和打印与客户机NFS调用相关的信息nfsstat -r # 显示和打印客户机和服务器的与RPC调用相关的信息nfsstat –s # 显示关于服务器接收和拒绝的RPC和NFS调用数目的信息}
hdfs{ hdfs --help # 所有参数hdfs dfs -help # 运行文件系统命令在Hadoop文件系统
hdfs dfs -ls /logs # 查看hdfs dfs -ls /user/ # 查看用户hdfs dfs -cathdfs dfs -dfhdfs dfs -duhdfs dfs -rmhdfs dfs -tailhdfs dfs –put localSrc dest # 上传文件hdfs dfsadmin -help # hdfs集群节点管理
hdfs dfsadmin -report # 基本的文件系统统计信息}}
网络{
rz # 通过ssh上传小文件
sz # 通过ssh下载小文件ifconfig eth0 down # 禁用网卡ifconfig eth0 up # 启用网卡ifup eth0:0 # 启用网卡mii-tool em1 # 查看网线是否连接traceroute www.baidu.com # 测试跳数vi /etc/resolv.conf # 设置DNS nameserver IP 定义DNS服务器的IP地址nslookup www.moon.com # 解析域名IPdig -x www.baidu.com # 解析域名IPdig +trace -t A domainname # 跟踪dnsdig +short txt hacker.wp.dg.cx # 通过 DNS 来读取 Wikipedia 的hacker词条host -t txt hacker.wp.dg.cx # 通过 DNS 来读取 Wikipedia 的hacker词条lynx # 文本上网wget -P path -O name url # 下载 包名:wgetrc -q 安静 -c 续传dhclient eth1 # 自动获取IPmtr -r www.baidu.com # 测试网络链路节点响应时间 # trace ping 结合ipcalc -m "$ip" -p "$num" # 根据IP和主机最大数计算掩码curl -I www.baidu.com # 查看网页http头curl -s www.baidu.com # 不显示进度queryperf -d list -s DNS_IP -l 2 # BIND自带DNS压力测试 [list 文件格式:www.turku.fi A]telnet ip port # 测试端口是否开放,有些服务可直接输入命令得到返回状态echo "show " |nc $ip $port # 适用于telnet一类登录得到命令返回nc -l -p port # 监听指定端口nc -nv -z 10.10.10.11 1080 |grep succeeded # 检查主机端口是否开放curl -o /dev/null -s -m 10 --connect-timeout 10 -w %{http_code} $URL # 检查页面状态curl -X POST -d "user=xuesong&pwd=123" http://www.abc.cn/Result # 提交POST请求curl -s http://20140507.ip138.com/ic.asp # 通过IP138取本机出口外网IPcurl http://IP/ -H "X-Forwarded-For: ip" -H "Host: www.ttlsa.com" # 连到指定IP的响应主机,HTTPserver只看 Host字段ifconfig eth0:0 192.168.1.221 netmask 255.255.255.0 # 增加逻辑IP地址echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all # 禁pingnet rpc shutdown -I IP_ADDRESS -U username%password # 远程关掉一台WINDOWS机器wget --random-wait -r -p -e robots=off -U Mozilla www.example.com # 递归方式下载整个网站sshpass -p "$pwd" rsync -avzP /dir user@$IP:/dir/ # 指定密码避免交互同步目录rsync -avzP --delete /dir user@$IP:/dir # 无差同步目录 可以快速清空大目录rsync -avzP -e "ssh -p 22 -e -o StrictHostKeyChecking=no" /dir user@$IP:/dir # 指定ssh参数同步}抓包{
-i eth1 # 只抓经过接口eth1的包
-t # 不显示时间戳-s 0 # 抓取数据包时默认抓取长度为68字节。加上-S 0 后可以抓到完整的数据包-c 100 # 只抓取100个数据包dst port ! 22 # 不抓取目标端口是22的数据包tcpdump tcp port 22 # 抓包tcpdump -n -vv udp port 53 # 抓udp的dns包 并显示iptcpdump port 10001 -A -s0 # 完整显示ascii数据包}
网卡流量查看{
watch more /proc/net/dev # 实时监控流量文件系统 累计值
iptraf # 网卡流量查看工具nethogs -d 5 eth0 eth1 # 按进程实时统计网络流量 epel源nethogsiftop -i eth0 -n -P # 实时流量监控sar {
-n参数有6个不同的开关: DEV | EDEV | NFS | NFSD | SOCK | ALLDEV显示网络接口信息EDEV显示关于网络错误的统计数据NFS统计活动的NFS客户端的信息NFSD统计NFS服务器的信息SOCK显示套 接字信息ALL显示所有5个开关sar -n DEV 1 10
rxpck/s # 每秒钟接收的数据包
txpck/s # 每秒钟发送的数据包rxbyt/s # 每秒钟接收的字节数txbyt/s # 每秒钟发送的字节数rxcmp/s # 每秒钟接收的压缩数据包txcmp/s # 每秒钟发送的压缩数据包rxmcst/s # 每秒钟接收的多播数据包}
}
netstat{
# 几十万并发的情况下netstat会没有响应,建议使用 ss 命令
-a # 显示所有连接中的Socket-t # 显示TCP连接-u # 显示UDP连接-n # 显示所有已建立的有效连接netstat -anlp # 查看链接netstat -tnlp # 只查看tcp监听端口netstat -r # 查看路由表}ss{
# netstat是遍历/proc下面每个PID目录,ss直接读/proc/net下面的统计信息。所以ss执行的时候消耗资源以及消耗的时间都比netstat少很多
ss -s # 列出当前socket详细信息ss -l # 显示本地打开的所有端口ss -tnlp # 显示每个进程具体打开的socketss -ant # 显示所有TCP socketss -u -a # 显示所有UDP Socektss dst 192.168.119.113 # 匹配远程地址ss dst 192.168.119.113:http # 匹配远程地址和端口号ss dst 192.168.119.113:3844 # 匹配远程地址和端口号ss src 192.168.119.103:16021 # 匹配本地地址和端口号ss -o state established '( dport = :smtp or sport = :smtp )' # 显示所有已建立的SMTP连接ss -o state established '( dport = :http or sport = :http )' # 显示所有已建立的HTTP连接ss -x src /tmp/.X11-unix/* # 找出所有连接X服务器的进程}
并发数查看{
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
SYN_RECV # 正在等待处理的请求ESTABLISHED # 正常数据传输状态,既当前并发数TIME_WAIT # 处理完毕,等待超时结束的请求CLOSE_WAIT # 客户端异常关闭,没有完成4次挥手 如大量可能存在攻击行为}
ssh{
ssh -p 22 user@192.168.1.209 # 从linux ssh登录另一台linux
ssh -p 22 root@192.168.1.209 CMD # 利用ssh操作远程主机scp -P 22 file root@ip:/dir # 把本地文件拷贝到远程主机scp -l 100000 file root@ip:/dir # 传输文件到远程,限制速度100Msshpass -p 'pwd' ssh -n root@$IP "echo hello" # 指定密码远程操作ssh -o StrictHostKeyChecking=no $IP # ssh连接不提示yesssh -t "su -" # 指定伪终端 客户端以交互模式工作scp root@192.168.1.209:/RemoteDir /localDir # 把远程指定文件拷贝到本地pscp -h host.ip /a.sh /opt/sbin/ # 批量传输文件ssh -N -L2001:remotehost:80 user@somemachine # 用SSH创建端口转发通道ssh -t host_A ssh host_B # 嵌套使用SSHssh -t -p 22 $user@$Ip /bin/su - root -c {$Cmd}; # 远程su执行命令 Cmd="\"/sbin/ifconfig eth0\""ssh-keygen -t rsa # 生成密钥ssh-copy-id -i xuesong@10.10.10.133 # 传送keyvi $HOME/.ssh/authorized_keys # 公钥存放位置sshfs name@server:/path/to/folder /path/to/mount/point # 通过ssh挂载远程主机上的文件夹fusermount -u /path/to/mount/point # 卸载ssh挂载的目录ssh user@host cat /path/to/remotefile | diff /path/to/localfile - # 用DIFF对比远程文件跟本地文件su - user -c "ssh user@192.168.1.1 \"echo -e aa |mail -s test mail@163.com\"" # 切换用户登录远程发送邮件pssh -h ip.txt -i uptime # 批量执行ssh yum install pssh}
网卡配置文件{
vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=noneBROADCAST=192.168.1.255HWADDR=00:0C:29:3F:E1:EAIPADDR=192.168.1.55NETMASK=255.255.255.0NETWORK=192.168.1.0ONBOOT=yesTYPE=EthernetGATEWAY=192.168.1.1#ARPCHECK=no # 进制arp检查}
route {
route # 查看路由表
route add default gw 192.168.1.1 dev eth0 # 添加默认路由route add -net 172.16.0.0 netmask 255.255.0.0 gw 10.39.111.254 # 添加静态路由网关route del -net 172.16.0.0 netmask 255.255.0.0 gw 10.39.111.254 # 删除静态路由网关}
静态路由{
vim /etc/sysconfig/static-routes
any net 192.168.12.0/24 gw 192.168.0.254any net 192.168.13.0/24 gw 192.168.0.254}
解决ssh链接慢{
sed -i 's/GSSAPIAuthentication yes/GSSAPIAuthentication no/' /etc/ssh/sshd_config
sed -i '/#UseDNS yes/a\UseDNS no' /etc/ssh/sshd_config/etc/init.d/sshd reload}
nmap{
nmap -PT 192.168.1.1-111 # 先ping在扫描主机开放端口
nmap -O 192.168.1.1 # 扫描出系统内核版本nmap -sV 192.168.1.1-111 # 扫描端口的软件版本nmap -sS 192.168.1.1-111 # 半开扫描(通常不会记录日志)nmap -P0 192.168.1.1-111 # 不ping直接扫描nmap -d 192.168.1.1-111 # 详细信息nmap -D 192.168.1.1-111 # 无法找出真正扫描主机(隐藏IP)nmap -p 20-30,139,60000- # 端口范围 表示:扫描20到30号端口,139号端口以及所有大于60000的端口nmap -P0 -sV -O -v 192.168.30.251 # 组合扫描(不ping、软件版本、内核版本、详细信息)# 不支持windows的扫描(可用于判断是否是windows)
nmap -sF 192.168.1.1-111nmap -sX 192.168.1.1-111nmap -sN 192.168.1.1-111}
snmp{
snmptranslate .1.3.6.1.2.1.1.3.0 # 查看映射关系
DISMAN-EVENT-MIB::sysUpTimeInstancesnmpdf -v 1 -c public localhost # SNMP监视远程主机的磁盘空间snmpnetstat -v 2c -c public -a 192.168.6.53 # SNMP获取指定IP的所有开放端口状态snmpwalk -v 2c -c public 10.152.14.117 .1.3.6.1.2.1.1.3.0 # SNMP获取主机启动时间# MIB安装(ubuntu)# sudo apt-get install snmp-mibs-downloader# sudo download-mibssnmpwalk -v 2c -c public 10.152.14.117 sysUpTimeInstance # SNMP通过MIB库获取主机启动时间}
磁盘{df -Ph # 查看硬盘容量
df -T # 查看磁盘分区格式df -i # 查看inode节点 如果inode用满后无法创建文件du -h dir # 检测目录下所有文件大小du -sh * # 显示当前目录中子目录的大小mount -l # 查看分区挂载情况fdisk -l # 查看磁盘分区状态fdisk /dev/hda3 # 分区mkfs -t ext3 /dev/hda3 # 格式化分区fsck -y /dev/sda6 # 对文件系统修复lsof |grep delete # 释放进程占用磁盘空间 列出进程后,查看文件是否存在,不存在则kill掉此进程tmpwatch -afv 10 /tmp # 删除10小时内未使用的文件 勿在重要目录使用cat /proc/filesystems # 查看当前系统支持文件系统mount -o remount,rw / # 修改只读文件系统为读写iotop # 进程占用磁盘IO情况 yum install iotopsmartctl -H /dev/sda # 检测硬盘状态 # yum install smartmontoolssmartctl -i /dev/sda # 检测硬盘信息smartctl -a /dev/sda # 检测所有信息e2label /dev/sda5 # 查看卷标e2label /dev/sda5 new-label # 创建卷标ntfslabel -v /dev/sda8 new-label # NTFS添加卷标tune2fs -j /dev/sda # ext2分区转ext3分区tune2fs -l /dev/sda # 查看文件系统信息mke2fs -b 2048 /dev/sda5 # 指定索引块大小dumpe2fs -h /dev/sda5 # 查看超级块的信息mount -t iso9660 /dev/dvd /mnt # 挂载光驱mount -t ntfs-3g /dev/sdc1 /media/yidong # 挂载ntfs硬盘mount -t nfs 10.0.0.3:/opt/images/ /data/img # 挂载nfs 需要重载 /etc/init.d/nfs reload 重启需要先启动 portmap 服务mount -o loop /software/rhel4.6.iso /mnt/ # 挂载镜像文件}
磁盘IO性能检测{
iostat -x 1 10
% user # 显示了在用户级(应用程序)执行时生成的 CPU 使用率百分比。
% system # 显示了在系统级(内核)执行时生成的 CPU 使用率百分比。% idle # 显示了在 CPU 空闲并且系统没有未完成的磁盘 I/O 请求时的时间百分比。% iowait # 显示了 CPU 空闲期间系统有未完成的磁盘 I/O 请求时的时间百分比。rrqm/s # 每秒进行 merge 的读操作数目。即 delta(rmerge)/s
wrqm/s # 每秒进行 merge 的写操作数目。即 delta(wmerge)/sr/s # 每秒完成的读 I/O 设备次数。即 delta(rio)/sw/s # 每秒完成的写 I/O 设备次数。即 delta(wio)/srsec/s # 每秒读扇区数。即 delta(rsect)/swsec/s # 每秒写扇区数。即 delta(wsect)/srkB/s # 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。(需要计算)wkB/s # 每秒写K字节数。是 wsect/s 的一半。(需要计算)avgrq-sz # 平均每次设备I/O操作的数据大小 (扇区)。delta(rsect+wsect)/delta(rio+wio)avgqu-sz # 平均I/O队列长度。即 delta(aveq)/s/1000 (因为aveq的单位为毫秒)。await # 平均每次设备I/O操作的等待时间 (毫秒)。即 delta(ruse+wuse)/delta(rio+wio)svctm # 平均每次设备I/O操作的服务时间 (毫秒)。即 delta(use)/delta(rio+wio)%util # 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。即 delta(use)/s/1000 (因为use的单位为毫秒)IO性能衡量标准{
1、 如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。
2、 idle 小于70% IO压力就较大了,一般读取速度有较多的wait.3、 同时可以结合 vmstat 查看查看b参数(等待资源的进程数)和wa参数(IO等待所占用的CPU时间的百分比,高过30%时IO压力高)4、 svctm 一般要小于 await (因为同时等待的请求的等待时间被重复计算了),svctm 的大小一般和磁盘性能有关,CPU/内存的负荷也会对其有影响,请求过多也会间接导致 svctm 的增加. await 的大小一般取决于服务时间(svctm) 以及 I/O 队列的长度和 I/O 请求的发出模式. 如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;如果 await 远大于 svctm,说明 I/O 队列太长,应用得到的响应时间变慢,如果响应时间超过了用户可以容许的范围,这时可以考虑更换更快的磁盘,调整内核 elevator 算法,优化应用,或者升级 CPU5、 队列长度(avgqu-sz)也可作为衡量系统 I/O 负荷的指标,但由于 avgqu-sz 是按照单位时间的平均值,所以不能反映瞬间的 I/O 洪水。}
}
iotop{
# 监视进程磁盘I/O
yum install iotop
-o # 只显示有io操作的进程
-b # 批量显示,无交互,主要用作记录到文件。-n NUM # 显示NUM次,主要用于非交互式模式。-d SEC # 间隔SEC秒显示一次。-p PID # 监控的进程pid。-u USER # 监控的进程用户。# 左右箭头:改变排序方式,默认是按IO排序。
r # 改变排序顺序。o # 只显示有IO输出的进程。p # 进程/线程的显示方式的切换。a # 显示累积使用量。q # 退出。}
创建swap文件方法{
dd if=/dev/zero of=/swap bs=1024 count=4096000 # 创建一个足够大的文件
# count的值等于1024 x 你想要的文件大小, 4096000是4Gmkswap /swap # 把这个文件变成swap文件swapon /swap # 启用这个swap文件/swap swap swap defaults 0 0 # 在每次开机的时候自动加载swap文件, 需要在 /etc/fstab 文件中增加一行cat /proc/swaps # 查看swapswapoff -a # 关闭swapswapon -a # 开启swap}
新硬盘挂载{
fdisk /dev/sdc
p # 打印分区d # 删除分区n # 创建分区,(一块硬盘最多4个主分区,扩展占一个主分区位置。p主分区 e扩展)w # 保存退出mkfs.ext4 -L 卷标 /dev/sdc1 # 格式化相应分区mount /dev/sdc1 /mnt # 挂载vi /etc/fstab # 添加开机挂载分区LABEL=/data /data ext4 defaults 1 2 # 用卷标挂载/dev/sdb1 /data4 ext4 defaults 1 2 # 用真实分区挂载/dev/sdb2 /data4 ext4 noatime,defaults 1 2第一个数字"1"该选项被"dump"命令使用来检查一个文件系统应该以多快频率进行转储,若不需要转储就设置该字段为0
第二个数字"2"该字段被fsck命令用来决定在启动时需要被扫描的文件系统的顺序,根文件系统"/"对应该字段的值应该为1,其他文件系统应该为2。若该文件系统无需在启动时扫描则设置该字段为0当以 noatime 选项加载(mount)文件系统时,对文件的读取不会更新文件属性中的atime信息。设置noatime的重要性是消除了文件系统对文件的写操作,文件只是简单地被系统读取。由于写操作相对读来说要更消耗系统资源,所以这样设置可以明显提高服务器的性能.wtime信息仍然有效,任何时候文件被写,该信息仍被更新。mount -a # 自动加载 fstab 文件挂载,避免配置错误,系统无法重启
}
大磁盘2T和16T分区{
parted /dev/sdb # 针对磁盘分区
(parted) mklabel gpt # 设置为 gpt(parted) print(parted) mkpart primary 0KB 22.0TB # 指定分区大小Is this still acceptable to you?Yes/No? YesIgnore/Cancel? Ignore(parted) printModel: LSI MR9271-8i (scsi)Disk /dev/sdb: 22.0TBSector size (logical/physical): 512B/512BPartition Table: gptNumber Start End Size File system Name Flags1 17.4kB 22.0TB 22.0TB primary(parted) quitmkfs.ext4 /dev/sdb1 # e2fsprogs升级后支持大于16T硬盘
# 大于16T的单个分区ext4格式化报错,需要升级e2fsprogs
Size of device /dev/sdb1 too big to be expressed in 32 bits using a blocksize of 4096.yum -y install xfsprogs
mkfs.xfs -f /dev/sdb1 # 大于16T单个分区也可以使用XFS分区,但inode占用很大,对大量的小文件支持不太好}
raid原理与区别{
raid0至少2块硬盘.吞吐量大,性能好,同时读写,但损坏一个就完蛋
raid1至少2块硬盘.相当镜像,一个存储,一个备份.安全性比较高.但是性能比0弱raid5至少3块硬盘.分别存储校验信息和数据,坏了一个根据校验信息能恢复raid6至少4块硬盘.两个独立的奇偶系统,可坏两块磁盘,写性能非常差}
用户{
users # 显示所有的登录用户
groups # 列出当前用户和他所属的组who -q # 显示所有的登录用户groupadd # 添加组useradd user # 建立用户passwd username # 修改密码userdel -r # 删除帐号及家目录chown -R user:group # 修改目录拥有者(R递归)chown y\.li:mysql # 修改所有者用户中包含点"."umask # 设置用户文件和目录的文件创建缺省屏蔽值chgrp # 修改用户组finger # 查找用户显示信息echo "xuesong" | passwd user --stdin # 非交互修改密码useradd -g www -M -s /sbin/nologin www # 指定组并不允许登录的用户,nologin允许使用服务useradd -g www -M -s /bin/false www # 指定组并不允许登录的用户,false最为严格useradd -d /data/song -g song song # 创建用户并指定家目录和组usermod -l newuser olduser # 修改用户名usermod -g user group # 修改用户所属组usermod -d dir -m user # 修改用户家目录usermod -G group user # 将用户添加到附加组gpasswd -d user group # 从组中删除用户su - user -c " #cmd1; " # 切换用户执行}
脚本{
#!/bin/sh # 在脚本第一行脚本头 # sh为当前系统默认shell,可指定为bash等shell
shopt # 显示和设置shell中的行为选项sh -x # 执行过程sh -n # 检查语法(a=bbk) # 括号创建子shell运行basename /a/b/c # 从全路径中保留最后一层文件名或目录dirname # 取路径$RANDOM # 随机数$$ # 进程号source FileName # 在当前bash环境下读取并执行FileName中的命令 # 等同 . FileNamesleep 5 # 间隔睡眠5秒trap # 在接收到信号后将要采取的行动trap "" 2 3 # 禁止ctrl+c$PWD # 当前目录$HOME # 家目录$OLDPWD # 之前一个目录的路径cd - # 返回上一个目录路径local ret # 局部变量yes # 重复打印yes |rm -i * # 自动回答y或者其他ls -p /home # 区分目录和文件夹ls -d /home/ # 查看匹配完整路径time a.sh # 测试程序执行时间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} # 排列组合(括号内一个元素分别和其他括号内元素组合)echo $((2#11010)) # 二进制转10进制echo aaa | tee file # 打印同时写入文件 默认覆盖 -a追加echo {1..10} # 打印10个字符printf '%10s\n'|tr " " a # 打印10个字符pwd | awk -F/ '{ print $2 }' # 返回目录名tac file |sed 1,3d|tac # 倒置读取文件 # 删除最后3行tail -3 file # 取最后3行outtmp=/tmp/$$`date +%s%N`.outtmp # 临时文件定义:(){ :|:& };: # fork炸弹,系统执行海量的进程,直到系统僵死echo -e "\e[32mcolour\e[0m" # 打印颜色echo -e "\033[32mcolour\033[m" # 打印颜色echo -e "\033[0;31mL\033[0;32mO\033[0;33mV\033[0;34mE\t\033[0;35mY\033[0;36mO\033[0;32mU\e[m" # 打印颜色正则表达式{
^ # 行首定位
$ # 行尾定位. # 匹配除换行符以外的任意字符* # 匹配0或多个重复字符+ # 重复一次或更多次? # 重复零次或一次? # 结束贪婪因子 .*? 表示最小匹配[] # 匹配一组中任意一个字符[^] # 匹配不在指定组内的字符\ # 用来转义元字符< # 词首定位符(支持vi和grep) <love> # 词尾定位符(支持vi和grep) love>x\{m\} # 重复出现m次x\{m,\} # 重复出现至少m次x\{m,n\} # 重复出现至少m次不超过n次X? # 匹配出现零次或一次的大写字母 XX+ # 匹配一个或多个字母 X() # 括号内的字符为一组(ab|de)+ # 匹配一连串的(最少一个) abc 或 def;abc 和 def 将匹配[[:alpha:]] # 代表所有字母不论大小写[[:lower:]] # 表示小写字母[[:upper:]] # 表示大写字母[[:digit:]] # 表示数字字符[[:digit:][:lower:]] # 表示数字字符加小写字母元字符{
\d # 匹配任意一位数字
\D # 匹配任意单个非数字字符\w # 匹配任意单个字母数字下划线字符,同义词是 [:alnum:]\W # 匹配非数字型的字符}
字符类:空白字符{
\s # 匹配任意的空白符
\S # 匹配非空白字符\b # 匹配单词的开始或结束\n # 匹配换行符\r # 匹配回车符\t # 匹配制表符\b # 匹配退格符\0 # 匹配空值字符}
字符类:锚定字符{
\b # 匹配字边界(不在[]中时)
\B # 匹配非字边界\A # 匹配字符串开头\Z # 匹配字符串或行的末尾\z # 只匹配字符串末尾\G # 匹配前一次m//g离开之处}
捕获{
(exp) # 匹配exp,并捕获文本到自动命名的组里
(?<name>exp) # 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)(?:exp) # 匹配exp,不捕获匹配的文本,也不给此分组分配组号}
零宽断言{
(?=exp) # 匹配exp前面的位置
(?<=exp) # 匹配exp后面的位置(?!exp) # 匹配后面跟的不是exp的位置(?<!exp) # 匹配前面不是exp的位置(?#comment) # 注释不对正则表达式的处理产生任何影响,用于注释}
特殊字符{
http://en.wikipedia.org/wiki/Ascii_table
^H \010 \b^M \015 \r匹配特殊字符: ctrl+V ctrl不放在按H或M 即可输出^H,用于匹配}
}
流程结构{
if判断{
if [ $a == $b ]
thenecho "等于"elseecho "不等于"fi}
case分支选择{
case $xs in
0) echo "0" ;;1) echo "1" ;;*) echo "其他" ;;esac}
while循环{
# while true 等同 while :
# 读文件为整行读入num=1while [ $num -lt 10 ]doecho $num((num=$num+2))done###########################grep a a.txt | while read adoecho $adone###########################while read adoecho $adone < a.txt}
for循环{
# 读文件已空格分隔
w=`awk -F ":" '{print $1}' c`for d in $wdo$ddone###########################for ((i=0;i<${#o[*]};i++))doecho ${o[$i]}done}
until循环{
# 当command不为0时循环
until commanddobodydone}
流程控制{
break N # 跳出几层循环
continue N # 跳出几层循环,循环次数不变continue # 重新循环次数不变}
}
变量{
A="a b c def" # 将字符串复制给变量
A=`cmd` # 将命令结果赋给变量A=$(cmd) # 将命令结果赋给变量eval a=\$$a # 间接调用i=2&&echo $((i+3)) # 计算后打印新变量结果i=2&&echo $[i+3] # 计算后打印新变量结果a=$((2>6?5:8)) # 判断两个值满足条件的赋值给变量$1 $2 $* # 位置参数 *代表所有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的值赋予$1name + 0 # 将字符串转换为数字number " " # 将数字转换成字符串a='ee';b='a';echo ${!b} # 间接引用name变量的值: ${a="cc"} # 如果a有值则不改变,如果a无值则赋值a变量为cc数组{
A=(a b c def) # 将变量定义为数組
${#A[*]} # 数组个数${A[*]} # 数组所有元素,大字符串${A[@]} # 数组所有元素,类似列表可迭代${A[2]} # 脚本的一个参数或数组第三位}
定义变量类型{
declare 或 typeset
-r 只读(readonly一样)-i 整形-a 数组-f 函数-x exportdeclare -i n=0}
系统变量{
$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:4:9} # 取变量中第4位到后面9位${A:(-1)} # 倒叙取最后一个字符${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为文件操作{
-a # 并且,两条件为真
-b # 是否块文件-p # 文件是否为一个命名管道-c # 是否字符文件-r # 文件是否可读-d # 是否一个目录-s # 文件的长度是否不为零-e # 文件是否存在-S # 是否为套接字文件-f # 是否普通文件-x # 文件是否可执行,则为真-g # 是否设置了文件的 SGID 位-u # 是否设置了文件的 SUID 位-G # 文件是否存在且归该组所有-w # 文件是否可写,则为真-k # 文件是否设置了的粘贴位-t fd # fd 是否是个和终端相连的打开的文件描述符(fd 默认为 1)-o # 或,一个条件为真-O # 文件是否存在且归该用户所有! # 取反}
expression为整数操作{
expr1 -a expr2 # 如果 expr1 和 expr2 评估为真,则为真
expr1 -o expr2 # 如果 expr1 或 expr2 评估为真,则为真}
两值比较{
整数 字符串
-lt < # 小于-gt > # 大于-le <= # 小于或等于-ge >= # 大于或等于-eq == # 等于-ne != # 不等于}
test 10 -lt 5 # 判断大小
echo $? # 查看上句test命令返回状态 # 结果0为真,1为假test -n "hello" # 判断字符串长度是否为0[ $? -eq 0 ] && echo "success" || exit # 判断成功提示,失败则退出}
重定向{
# 标准输出 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 # 以读写的方式打开 filecmd < file cmd # 命令以 file 文件作为 stdincmd << delimitercmd; #从 stdin 中读入,直至遇到 delimiter 分界符delimiter>&n # 使用系统调用 dup (2) 复制文件描述符 n 并把结果用作标准输出
<&n # 标准输入复制自文件描述符 n<&- # 关闭标准输入(键盘)>&- # 关闭标准输出n<&- # 表示将 n 号输入关闭n>&- # 表示将 n 号输出关闭}
运算符{
$[]等同于$(()) # $[]表示形式告诉shell求中括号中的表达式的值
~var # 按位取反运算符,把var中所有的二进制为1的变为0,为0的变为1var\<<str # 左移运算符,把var中的二进制位向左移动str位,忽略最左端移出的各位,最右端的各位上补上0值,每做一次按位左移就有var乘2var>>str # 右移运算符,把var中所有的二进制位向右移动str位,忽略最右移出的各位,最左的各位上补0,每次做一次右移就有实现var除以2var&str # 与比较运算符,var和str对应位,对于每个二进制来说,如果二都为1,结果为1.否则为0var^str # 异或运算符,比较var和str对应位,对于二进制来说如果二者互补,结果为1,否则为0var|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 # 运算let x=16/4let x=5**5}expr{ expr 14 % 9 # 整数运算SUM=`expr 2 \* 3` # 乘后结果赋值给变量LOOP=`expr $LOOP + 1` # 增量计数(加循环即可) LOOP=0expr length "bkeep zbb" # 计算字串长度expr substr "bkeep zbb" 4 9 # 抓取字串expr index "bkeep zbb" e # 抓取第一个字符数字串出现的位置expr 30 / 3 / 2 # 运算符号有空格expr bkeep.doc : '.*' # 模式匹配(可以使用expr通过指定冒号选项计算字符串中字符数)expr bkeep.doc : '\(.*\).doc' # 在expr中可以使用字符串匹配操作,这里使用模式抽取.doc文件附属名数值测试{ #如果试图计算非整数,则会返回错误rr=3.4expr $rr + 1expr: non-numeric argumentrr=5expr $rr + 16}}bc{ echo "m^n"|bc # 次方计算seq -s '+' 1000 |bc # 从1加到1000seq 1 1000 |tr "\n" "+"|sed 's/+$/\n/'|bc # 从1加到1000}}grep{
-c # 显示匹配到得行的数目,不显示内容-h # 不显示文件名-i # 忽略大小写-l # 只列出匹配行所在文件的文件名-n # 在每一行中加上相对行号-s # 无声操作只显示报错,检查退出状态-v # 反向查找-e # 使用正则表达式-w # 精确匹配-wc # 精确匹配次数-o # 查询所有匹配字段-P # 使用perl正则表达式-A3 # 打印匹配行和下三行-B3 # 打印匹配行和上三行-C3 # 打印匹配行和上下三行grep -v "a" txt # 过滤关键字符行grep -w 'a\>' txt # 精确匹配字符串grep -i "a" txt # 大小写敏感grep "a[bB]" txt # 同时匹配大小写grep '[0-9]\{3\}' txt # 查找0-9重复三次的所在行grep -E "word1|word2|word3" file # 任意条件匹配grep word1 file | grep word2 |grep word3 # 同时匹配三个echo quan@163.com |grep -Po '(?<=@.).*(?=.$)' # 零宽断言截取字符串 # 63.coecho "I'm singing while you're dancing" |grep -Po '\b\w+(?=ing\b)' # 零宽断言匹配echo 'Rx Optical Power: -5.01dBm, Tx Optical Power: -2.41dBm' |grep -Po '(?<=:).*?(?=d)' # 取出d前面数字 # ?为最小匹配echo 'Rx Optical Power: -5.01dBm, Tx Optical Power: -2.41dBm' | grep -Po '[-0-9.]+' # 取出d前面数字 # ?为最小匹配echo '["mem",ok],["hardware",false],["filesystem",false]' |grep -Po '[^"]+(?=",false)' # 取出false前面的字母echo '["mem",ok],["hardware",false],["filesystem",false]' |grep -Po '\w+",false'|grep -Po '^\w+' # 取出false前面的字母grep用于if判断{ if echo abc | grep "a" > /dev/null 2>&1thenecho "abc"elseecho "null"fi}}trap{
信号 说明HUP(1) # 挂起,通常因终端掉线或用户退出而引发INT(2) # 中断,通常因按下Ctrl+C组合键而引发QUIT(3) # 退出,通常因按下Ctrl+\组合键而引发ABRT(6) # 中止,通常因某些严重的执行错误而引发ALRM(14) # 报警,通常用来处理超时TERM(15) # 终止,通常在系统关机时发送trap捕捉到信号之后,可以有三种反应方式:1、执行一段程序来处理这一信号2、接受信号的默认操作3、忽视这一信号第一种形式的trap命令在shell接收到 signal list 清单中数值相同的信号时,将执行双引号中的命令串:trap 'commands' signal-list # 单引号,要在shell探测到信号来的时候才执行命令和变量的替换,时间一直变trap "commands" signal-list # 双引号,shell第一次设置信号的时候就执行命令和变量的替换,时间不变}awk{
# 默认是执行打印全部 print $0# 1为真 打印$0# 0为假 不打印-F # 改变FS值(分隔符)~ # 域匹配== # 变量匹配!~ # 匹配不包含= # 赋值!= # 不等于+= # 叠加\b # 退格\f # 换页\n # 换行\r # 回车\t # 制表符Tab\c # 代表任一其他字符-F"[ ]+|[%]+" # 多个空格或多个%为分隔符[a-z]+ # 多个小写字母[a-Z] # 代表所有大小写字母(aAbB...zZ)[a-z] # 代表所有大小写字母(ab...z)[:alnum:] # 字母数字字符[:alpha:] # 字母字符[:cntrl:] # 控制字符[:digit:] # 数字字符[:graph:] # 非空白字符(非空格、控制字符等)[:lower:] # 小写字母[:print:] # 与[:graph:]相似,但是包含空格字符[:punct:] # 标点字符[:space:] # 所有的空白字符(换行符、空格、制表符)[:upper:] # 大写字母[:xdigit:] # 十六进制的数字(0-9a-fA-F)[[:digit:][:lower:]] # 数字和小写字母(占一个字符)内建变量{ $n # 当前记录的第 n 个字段,字段间由 FS 分隔$0 # 完整的输入记录ARGC # 命令行参数的数目ARGIND # 命令行中当前文件的位置 ( 从 0 开始算 )ARGV # 包含命令行参数的数组CONVFMT # 数字转换格式 ( 默认值为 %.6g)ENVIRON # 环境变量关联数组ERRNO # 最后一个系统错误的描述FIELDWIDTHS # 字段宽度列表 ( 用空格键分隔 )FILENAME # 当前文件名FNR # 同 NR ,但相对于当前文件FS # 字段分隔符 ( 默认是任何空格 )IGNORECASE # 如果为真(即非 0 值),则进行忽略大小写的匹配NF # 当前记录中的字段数(列)NR # 当前行数OFMT # 数字的输出格式 ( 默认值是 %.6g)OFS # 输出字段分隔符 ( 默认值是一个空格 )ORS # 输出记录分隔符 ( 默认值是一个换行符 )RLENGTH # 由 match 函数所匹配的字符串的长度RS # 记录分隔符 ( 默认是一个换行符 )RSTART # 由 match 函数所匹配的字符串的第一个位置SUBSEP # 数组下标分隔符 ( 默认值是 /034)BEGIN # 先处理(可不加文件参数)END # 结束时处理}内置函数{ gsub(r,s) # 在整个$0中用s替代r 相当于 sed 's///g'gsub(r,s,t) # 在整个t中用s替代rindex(s,t) # 返回s中字符串t的第一位置length(s) # 返回s长度match(s,r) # 测试s是否包含匹配r的字符串split(s,a,fs) # 在fs上将s分成序列asprint(fmt,exp) # 返回经fmt格式化后的expsub(r,s) # 用$0中最左边最长的子串代替s 相当于 sed 's///'substr(s,p) # 返回字符串s中从p开始的后缀部分substr(s,p,n) # 返回字符串s中从p开始长度为n的后缀部分}awk判断{ awk '{print ($1>$2)?"第一排"$1:"第二排"$2}' # 条件判断 括号代表if语句判断 "?"代表then ":"代表elseawk '{max=($1>$2)? $1 : $2; print max}' # 条件判断 如果$1大于$2,max值为为$1,否则为$2awk '{if ( $6 > 50) print $1 " Too high" ;\else print "Range is OK"}' fileawk '{if ( $6 > 50) { count++;print $3 } \else { x+5; print $2 } }' file}awk循环{ awk '{i = 1; while ( i <= NF ) { print NF, $i ; i++ } }' fileawk '{ for ( i = 1; i <= NF; i++ ) print NF,$i }' file}awk '/Tom/' file # 打印匹配到得行awk '/^Tom/{print $1}' # 匹配Tom开头的行 打印第一个字段awk '$1 !~ /ly$/' # 显示所有第一个字段不是以ly结尾的行awk '$3 <40' # 如果第三个字段值小于40才打印awk '$4==90{print $5}' # 取出第四列等于90的第五列awk '/^(no|so)/' test # 打印所有以模式no或so开头的行awk '$3 * $4 > 500' # 算术运算(第三个字段和第四个字段乘积大于500则显示)awk '{print NR" "$0}' # 加行号awk '/tom/,/suz/' # 打印tom到suz之间的行awk '{a+=$1}END{print a}' # 列求和awk 'sum+=$1{print sum}' # 将$1的值叠加后赋给sumawk '{a+=$1}END{print a/NR}' # 列求平均值awk '!s[$1 $3]++' file # 根据第一列和第三列过滤重复行awk -F'[ :\t]' '{print $1,$2}' # 以空格、:、制表符Tab为分隔符awk '{print "'"$a"'","'"$b"'"}' # 引用外部变量awk '{if(NR==52){print;exit}}' # 显示第52行awk '/关键字/{a=NR+2}a==NR {print}' # 取关键字下第几行awk 'gsub(/liu/,"aaaa",$1){print $0}' # 只打印匹配替换后的行ll | awk -F'[ ]+|[ ][ ]+' '/^$/{print $8}' # 提取时间,空格不固定awk '{$1="";$2="";$3="";print}' # 去掉前三列echo aada:aba|awk '/d/||/b/{print}' # 匹配两内容之一echo aada:abaa|awk -F: '$1~/d/||$2~/b/{print}' # 关键列匹配两内容之一echo Ma asdas|awk '$1~/^[a-Z][a-Z]$/{print }' # 第一个域匹配正则echo aada:aaba|awk '/d/&&/b/{print}' # 同时匹配两条件awk 'length($1)=="4"{print $1}' # 字符串位数awk '{if($2>3){system ("touch "$1)}}' # 执行系统命令awk '{sub(/Mac/,"Macintosh",$0);print}' # 用Macintosh替换Macawk '{gsub(/Mac/,"MacIntosh",$1); print}' # 第一个域内用Macintosh替换Macawk -F '' '{ for(i=1;i<NF+1;i++)a+=$i ;print a}' # 多位数算出其每位数的总和.比如 1234, 得到 10awk '{ i=$1%10;if ( i == 0 ) {print i}}' # 判断$1是否整除(awk中定义变量引用时不能带 $ )awk 'BEGIN{a=0}{if ($1>a) a=$1 fi}END{print a}' # 列求最大值 设定一个变量开始为0,遇到比该数大的值,就赋值给该变量,直到结束awk 'BEGIN{a=11111}{if ($1<a) a=$1 fi}END{print a}' # 求最小值awk '{if(A)print;A=0}/regexp/{A=1}' # 查找字符串并将匹配行的下一行显示出来,但并不显示匹配行awk '/regexp/{print A}{A=$0}' # 查找字符串并将匹配行的上一行显示出来,但并不显示匹配行awk '{if(!/mysql/)gsub(/1/,"a");print $0}' # 将1替换成a,并且只在行中未出现字串mysql的情况下替换awk 'BEGIN{srand();fr=int(100*rand());print fr;}' # 获取随机数awk '{if(NR==3)F=1}{if(F){i++;if(i%7==1)print}}' # 从第3行开始,每7行显示一次awk '{if(NF<1){print i;i=0} else {i++;print $0}}' # 显示空行分割各段的行数echo +null:null |awk -F: '$1!~"^+"&&$2!="null"{print $0}' # 关键列同时匹配awk -v RS=@ 'NF{for(i=1;i<=NF;i++)if($i) printf $i;print ""}' # 指定记录分隔符awk '{b[$1]=b[$1]$2}END{for(i in b){print i,b[i]}}' # 列叠加awk '{ i=($1%100);if ( $i >= 0 ) {print $0,$i}}' # 求余数awk '{b=a;a=$1; if(NR>1){print a-b}}' # 当前行减上一行awk '{a[NR]=$1}END{for (i=1;i<=NR;i++){print a[i]-a[i-1]}}' # 当前行减上一行awk -F: '{name[x++]=$1};END{for(i=0;i<NR;i++)print i,name[i]}' # END只打印最后的结果,END块里面处理数组内容awk '{sum2+=$2;count=count+1}END{print sum2,sum2/count}' # $2的总和 $2总和除个数(平均值)awk -v a=0 -F 'B' '{for (i=1;i<NF;i++){ a=a+length($i)+1;print a }}' # 打印所以B的所在位置awk 'BEGIN{ "date" | getline d; split(d,mon) ; print mon[2]}' file # 将date值赋给d,并将d设置为数组mon,打印mon数组中第2个元素awk 'BEGIN{info="this is a test2010test!";print substr(info,4,10);}' # 截取字符串(substr使用)awk 'BEGIN{info="this is a test2010test!";print index(info,"test")?"ok":"no found";}' # 匹配字符串(index使用)awk 'BEGIN{info="this is a test2010test!";print match(info,/[0-9]+/)?"ok":"no found";}' # 正则表达式匹配查找(match使用)awk '{for(i=1;i<=4;i++)printf $i""FS; for(y=10;y<=13;y++) printf $y""FS;print ""}' # 打印前4列和后4列awk 'BEGIN{for(n=0;n++<9;){for(i=0;i++<n;)printf i"x"n"="i*n" ";print ""}}' # 乘法口诀awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA){print k,tA[k];}}' # 字符串分割(split使用)awk '{if (system ("grep "$2" tmp/* > /dev/null 2>&1") == 0 ) {print $1,"Y"} else {print $1,"N"} }' a # 执行系统命令判断返回状态awk '{for(i=1;i<=NF;i++) a[i,NR]=$i}END{for(i=1;i<=NF;i++) {for(j=1;j<=NR;j++) printf a[i,j] " ";print ""}}' # 将多行转多列netstat -an|awk -v A=$IP -v B=$PORT 'BEGIN{print "Clients\tGuest_ip"}$4~A":"B{split($5,ip,":");a[ip[1]]++}END{for(i in a)print a[i]"\t"i|"sort -nr"}' # 统计IP连接个数cat 1.txt|awk -F" # " '{print "insert into user (user,password,email)values(""'\''"$1"'\'\,'""'\''"$2"'\'\,'""'\''"$3"'\'\)\;'"}' >>insert_1.txt # 处理sql语句awk 'BEGIN{printf "what is your name?";getline name < "/dev/tty" } $1 ~name {print "FOUND" name " on line ", NR "."} END{print "see you," name "."}' file # 两文件匹配取本机IP{ /sbin/ifconfig |awk -v RS="Bcast:" '{print $NF}'|awk -F: '/addr/{print $2}'/sbin/ifconfig |awk '/inet/&&$2!~"127.0.0.1"{split($2,a,":");print a[2]}'/sbin/ifconfig |awk -v RS='inet addr:' '$1!="eth0"&&$1!="127.0.0.1"{print $1}'|awk '{printf"%s|",$0}'/sbin/ifconfig |awk '{printf("line %d,%s\n",NR,$0)}' # 指定类型(%d数字,%s字符)}查看磁盘空间{ df -h|awk -F"[ ]+|%" '$5>14{print $5}'df -h|awk 'NR!=1{if ( NF == 6 ) {print $5} else if ( NF == 5) {print $4} }'df -h|awk 'NR!=1 && /%/{sub(/%/,"");print $(NF-1)}'df -h|sed '1d;/ /!N;s/\n//;s/ \+/ /;' #将磁盘分区整理成一行 可直接用 df -P}排列打印{ awk 'END{printf "%-10s%-10s\n%-10s%-10s\n%-10s%-10s\n","server","name","123","12345","234","1234"}' txtawk 'BEGIN{printf "|%-10s|%-10s|\n|%-10s|%-10s|\n|%-10s|%-10s|\n","server","name","123","12345","234","1234"}'awk 'BEGIN{ print " *** 开 始 *** ";print "+-----------------+";printf "|%-5s|%-5s|%-5s|\n","id","name","ip";}$1!=1 && NF==4{printf "|%-5s|%-5s|%-5s|\n",$1,$2,$3" "$11}END{ print "+-----------------+";print " *** 结 束 *** "}' txt}awk经典题{ 分析图片服务日志,把日志(每个图片访问次数*图片大小的总和)排行,也就是计算每个url的总访问大小说明:本题生产环境应用:这个功能可以用于IDC网站流量带宽很高,然后通过分析服务器日志哪些元素占用流量过大,进而进行优化或裁剪该图片,压缩js等措施。本题需要输出三个指标: 【被访问次数】 【访问次数*单个被访问文件大小】 【文件名(带URL)】测试数据59.33.26.105 - - [08/Dec/2010:15:43:56 +0800] "GET /static/images/photos/2.jpg HTTP/1.1" 200 11299awk '{array_num[$7]++;array_size[$7]+=$10}END{for(i in array_num) {print array_num[i]" "array_size[i]" "i}}'}awk练习题{ wang 4cui 3zhao 4liu 3liu 3chang 5li 21 通过第一个域找出字符长度为4的2 当第二列值大于3时,创建空白文件,文件名为当前行第一个域$1 (touch $1)3 将文档中 liu 字符串替换为 hong4 求第二列的和5 求第二列的平均值6 求第二列中的最大值7 将第一列过滤重复后,列出每一项,每一项的出现次数,每一项的大小总和1、字符串长度awk 'length($1)=="4"{print $1}'2、执行系统命令awk '{if($2>3){system ("touch "$1)}}'3、gsub(/r/,"s",域) 在指定域(默认$0)中用s替代r (sed 's///g')awk '{gsub(/liu/,"hong",$1);print $0}' a.txt4、列求和awk '{a+=$2}END{print a}'5、列求平均值awk '{a+=$2}END{print a/NR}'awk '{a+=$2;b++}END{print a,a/b}'6、列求最大值awk 'BEGIN{a=0}{if($2>a) a=$2 }END{print a}'7、将第一列过滤重复列出每一项,每一项的出现次数,每一项的大小总和awk '{a[$1]++;b[$1]+=$2}END{for(i in a){print i,a[i],b[i]}}'}awk处理复杂日志{ 6.19:DHB_014_号百总机服务业务日报:广州 到达数异常!DHB_023_号百漏话提醒日报:珠海 到达数异常!6.20:DHB_014_号百总机服务业务日报:广州 到达数异常!到awk -F '[_ :]+' 'NF>2{print $4,$1"_"$2,b |"sort";next}{b=$1}'# 当前行NF小于等于2 只针对{print $4,$1"_"$2,b |"sort";next} 有效 即 6.19:行跳过此操作, {b=$1} 仍然执行# 当前行NF大于2 执行到 next 强制跳过本行,即跳过后面的 {b=$1}广州 DHB_014 6.19}} sed{ # 先读取资料、存入模式空间、对其进行编辑、再输出、再用下一行替换模式空间内容# 调试工具sedsed (参数 -d) http://aurelio.net/sedsed/sedsed-1.0-n # 输出由编辑指令控制(取消默认的输出,必须与编辑指令一起配合)-i # 直接对文件操作-e # 多重编辑-r # 正则可不转移特殊字符b # 跳过匹配的行p # 打印d # 删除s # 替换g # 配合s全部替换i # 行前插入a # 行后插入r # 读y # 转换q # 退出& # 代表查找的串内容* # 任意多个 前驱字符(前导符)? # 0或1个 最小匹配 没加-r参数需转义 \?$ # 最后一行.* # 匹配任意多个字符\(a\) # 保存a作为标签1(\1)模式空间{ # 模式空间(两行两行处理) 模式匹配的范围,一般而言,模式空间是输入文本中某一行,但是可以通过使用N函数把多于一行读入模式空间# 暂存空间里默认存储一个空行n # 读入下一行(覆盖上一行)h # 把模式空间里的行拷贝到暂存空间H # 把模式空间里的行追加到暂存空间g # 用暂存空间的内容替换模式空间的行G # 把暂存空间的内容追加到模式空间的行后x # 将暂存空间的内容于模式空间里的当前行互换! # 对其前面的要匹配的范围取反D # 删除当前模式空间中直到并包含第一个换行符的所有字符(/.*/匹配模式空间中所有内容,匹配到就执行D,没匹配到就结束D)N # 追加下一个输入行到模式空间后面并在第二者间嵌入一个换行符,改变当前行号码,模式匹配可以延伸跨域这个内嵌换行p # 打印模式空间中的直到并包含第一个换行的所有字符}标签函数{ : lable # 建立命令标记,配合b,t函数使用跳转b lable # 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。t labe # 判断分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令出,或者到脚本末尾。与b函数不同在于t在执行跳转前会先检查其前一个替换命令是否成功,如成功,则执行跳转。sed -e '{:p1;/A/s/A/AA/;/B/s/B/BB/;/[AB]\{10\}/b;b p1;}' # 文件内容第一行A第二行B:建立标签p1;两个替换函数(A替换成AA,B替换成BB)当A或者B达到10个以后调用b,返回echo 'sd f f [a b c cddd eee]' | sed ':n;s#\(\[[^ ]*\) *#\1#;tn' # 标签函数t使用方法,替换[]里的空格echo "198723124.03"|sed -r ':a;s/([0-9]+)([0-9]{3})/\1,\2/;ta' # 每三个字符加一个逗号}引用外部变量{ sed -n ''$a',10p'sed -n ""$a",10p"}sed 10q # 显示文件中的前10行 (模拟"head")sed -n '$=' # 计算行数(模拟 "wc -l")sed -n '5,/^no/p' # 打印从第5行到以no开头行之间的所有行sed -i "/^$f/d" a # 删除匹配行sed -i '/aaa/,$d' # 删除匹配行到末尾sed -i "s/=/:/" c # 直接对文本替换sed -i "/^pearls/s/$/j/" # 找到pearls开头在行尾加jsed '/1/,/3/p' file # 打印1和3之间的行sed -n '1p' file # 取出指定行sed '5i\aaa' file # 在第5行之前插入行sed '5a\aaa' file # 在第5行之后抽入行echo a|sed -e '/a/i\b' # 在匹配行前插入一行echo a|sed -e '/a/a\b' # 在匹配行后插入一行echo a|sed 's/a/&\nb/g' # 在匹配行后插入一行seq 10| sed -e{1,3}'s/./a/' # 匹配1和3行替换sed -n '/regexp/!p' # 只显示不匹配正则表达式的行sed '/regexp/d' # 只显示不匹配正则表达式的行sed '$!N;s/\n//' # 将每两行连接成一行sed '/baz/s/foo/bar/g' # 只在行中出现字串"baz"的情况下将"foo"替换成"bar"sed '/baz/!s/foo/bar/g' # 将"foo"替换成"bar",并且只在行中未出现字串"baz"的情况下替换echo a|sed -e 's/a/#&/g' # 在a前面加#号sed 's/foo/bar/4' # 只替换每一行中的第四个字串sed 's/\(.*\)foo/\1bar/' # 替换每行最后一个字符串sed 's/\(.*\)foo\(.*foo\)/\1bar\2/' # 替换倒数第二个字符串sed 's/[0-9][0-9]$/&5' # 在以[0-9][0-9]结尾的行后加5sed -n ' /^eth\|em[01][^:]/{n;p;}' # 匹配多个关键字sed -n -r ' /eth|em[01][^:]/{n;p;}' # 匹配多个关键字echo -e "1\n2"|xargs -i -t sed 's/^/1/' {} # 同时处理多个文件sed '/west/,/east/s/$/*VACA*/' # 修改west和east之间的所有行,在结尾处加*VACA*sed 's/[^1-9]*\([0-9]\+\).*/\1/' # 取出第一组数字,并且忽略掉开头的0sed -n '/regexp/{g;1!p;};h' # 查找字符串并将匹配行的上一行显示出来,但并不显示匹配行sed -n ' /regexp/{n;p;}' # 查找字符串并将匹配行的下一行显示出来,但并不显示匹配行sed -n 's/\(mar\)got/\1ianne/p' # 保存\(mar\)作为标签1sed -n 's/\([0-9]\+\).*\(t\)/\2\1/p' # 保存多个标签sed -i -e '1,3d' -e 's/1/2/' # 多重编辑(先删除1-3行,在将1替换成2)sed -e 's/@.*//g' -e '/^$/d' # 删除掉@后面所有字符,和空行sed -n -e "{s/^ *[0-9]*//p}" # 打印并删除正则表达式的那部分内容echo abcd|sed 'y/bd/BE/' # 匹配字符替换sed '/^#/b;y/y/P/' 2 # 非#号开头的行替换字符sed '/suan/r readfile' # 找到含suan的行,在后面加上读入的文件内容sed -n '/no/w writefile' # 找到含no的行,写入到指定文件中sed '/regex/G' # 在匹配式样行之后插入一空行sed '/regex/{x;p;x;G;}' # 在匹配式样行之前和之后各插入一空行sed 'n;d' # 删除所有偶数行sed 'G;G' # 在每一行后面增加两空行sed '/^$/d;G' # 在输出的文本中每一行后面将有且只有一空行sed 'n;n;n;n;G;' # 在每5行后增加一空白行sed -n '5~5p' # 只打印行号为5的倍数seq 1 30|sed '5~5s/.*/a/' # 倍数行执行替换sed -n '3,${p;n;n;n;n;n;n;}' # 从第3行开始,每7行显示一次sed -n 'h;n;G;p' # 奇偶调换seq 1 10|sed '1!G;h;$!d' # 倒叙排列ls -l|sed -n '/^.rwx.*/p' # 查找属主权限为7的文件sed = filename | sed 'N;s/\n/\t/' # 为文件中的每一行进行编号(简单的左对齐方式)sed 's/^[ \t]*//' # 将每一行前导的"空白字符"(空格,制表符)删除,使之左对齐sed 's/^[ \t]*//;s/[ \t]*$//' # 将每一行中的前导和拖尾的空白字符删除sed '/{abc,def\}\/\[111,222]/s/^/00000/' # 匹配需要转行的字符: } / [echo abcd\\nabcde |sed 's/\\n/@/g' |tr '@' '\n' # 将换行符转换为换行cat tmp|awk '{print $1}'|sort -n|sed -n '$p' # 取一列最大值sed -n '{s/^[^\/]*//;s/\:.*//;p}' /etc/passwd # 取用户家目录(匹配不为/的字符和匹配:到结尾的字符全部删除)sed = filename | sed 'N;s/^/ /; s/ *\(.\{6,\}\)\n/\1 /' # 对文件中的所有行编号(行号在左,文字右端对齐)/sbin/ifconfig |sed 's/.*inet addr:\(.*\) Bca.*/\1/g' |sed -n '/eth/{n;p}' # 取所有IP修改keepalive配置剔除后端服务器{ sed -i '/real_server.*10.0.1.158.*8888/,+8 s/^/#/' keepalived.confsed -i '/real_server.*10.0.1.158.*8888/,+8 s/^#//' keepalived.conf}模仿rev功能{ echo 123 |sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//;'/\n/!G; # 没有\n换行符,要执行G,因为保留空间中为空,所以在模式空间追加一空行s/\(.\)\(.*\n\)/&\2\1/; # 标签替换 &\n23\n1$ (关键在于& ,可以让后面//匹配到空行)//D; # D 命令会引起循环删除模式空间中的第一部分,如果删除后,模式空间中还有剩余行,则返回 D 之前的命令,重新执行,如果 D 后,模式空间中没有任何内容,则将退出。 //D 匹配空行执行D,如果上句s没有匹配到,//也无法匹配到空行, "//D;"命令结束s/.//; # D结束后,删除开头的 \n}}xargs{
# 命令替换-t 先打印命令,然后再执行-i 用每项替换 {}find / -perm +7000 | xargs ls -l # 将前面的内容,作为后面命令的参数seq 1 10 |xargs -i date -d "{} days " +%Y-%m-%d # 列出10天日期}