★shell编程
#!/bin/bash 指定了shell脚本的执行shell
使用bash命令来运行脚本时,-v和-x选项可以显示输入行和命令。
1.变量
变量名区分大小写,无须声明,可以直接赋值;引用变量需要在变量前面加$符号。注意:直接赋值时变量和=之间不带空格,如'var=100'。
如果需要用变量和其他字符组成新的字符串,可以把变量用{}括起来。变量后还可以加一个参数表示如果变量没有初始化就使用的值.形式是{var:-val}
对于未赋值的变量,bash会以空值对待,也可以使用unset命令来清除给变量赋的值。
数组形式为:变量名[下标]=值,或者 变量名={多个值}。下标可以用字符。
declare或typeset可以使用+/-r选项来设置/撤销变量的只读属性。
export可以把变量输出到环境中,以使其他程序也可以使用。相反,使用local声明的变量是局部变量,仅供在当前函数内使用。
特定shell变量:$0当前命令对应的可执行文件名;$1-$9命令参数;$#参数个数;$*所有参数;$@所有参数,并且每个参数以'括住;$$当前进程ID号;$?最后的命令的退出状态,如果正常退出则返回0,反之为非0值。
2.特有命令
: 空,永远返回true,可用于while循环作为条件
shift 可以后跟一个数字n来左移n个参数
read 从输入设备读入变量值,后必须跟一个变量名
echo 显示信息
eval 它把参数连接成一个命令让shell执行
exec 执行命令
return/break/continue 在函数和循环中使用
3.比较语句
使用test expression或[ expression ]形式. 注意,在bash语法中,if语句中应该使用[[ ]]进行判断。
字符串比较:比较两个字符串内容是否相同可以直接使用=或!=操作符。选项-n用于判断字符串是否非空。选项-z用于判断字符串是否为空。使用=~来判断正则匹配,比如[ "${line}" =~ ".*${keywd}.*" ]来判断line中是否包含keywd。注意:对字符串进行判断时,一定要使用""括住变量,而不能直接判断变量,否则会得到错误的结果。例如$nu; 则[ -n $nu ]为真;[ -n "$nu" ]为假。
数值比较:使用选项-eq,-ne,-lt,-gt,-le,-ge来判断两个数值之间的大小。
文件操作:选项-d,-f,-L分别用于判断对象类型是否是目录,文件和符号链接。选项-r,-w,-x分别用于判断文件属性是否是可读,可写,可执行。选项-e用来判断文件是否存在,选项-s用来判断文件长度是否大于零。选项-n用来判断第一个文件是否比第二个文件新(根据修改日期)。
逻辑操作:使用选项-a,-o,!来表示与,或,非的逻辑操作。
4.算术计算语句
使用let expression或(( expression ))形式
可以在表达式里使用多种操作符,如+,-,*,/,%,<=,>=,<,>,==,!=,=等
注:返回的是一个变量,故赋值前要加$符号,使用类似以下方式赋值:
var=100
var=$(($var+1))
5.控制语句
for循环语法格式如下:
for var in list
do
...
done
以上语句对list列表中以空格等分隔的对象实行遍历。
while循环语法格式如下:
while condition
do
...
done
当条件为真时循环执行。
until循环语法格式如下:
until condition
do
...
done
当条件为假时循环执行。
if语句语法如下:
if cond1
then
...
elif cond2
then
...
else
...
fi
case语句语法如下:
case string in
str1|str2)
...
;;
str3)
...
;;
*)
...
;;
esac
select语句语法如下:
select name in list
do
... #一般在这里使用case
done
6.函数
函数定义的基本格式如下:
function name
{
...
}
函数调用的形式类似于普通的命令,也可以加参数。并且函数可以采用递归形式。
★linux基本命令
1.命令语法
" " 双引号表示整个引号内的内容是一个完整字符串,如果字符串中包含环境变量,则会在执行时被替换成环境变量对应的内容
' ' 单引号也表示整个引号内的内容是一个完整字符串,但不会对环境变量进行替换
` ` 反引号括起来的内容被作为命令行处理,执行的结果用来代替整个反引号所括起来的内容.也可以使用$(cmd)形式
; 用来在命令行中分隔多个命令,多个命令会顺序执行,但前一个命令是否成功执行并不会影响后一个命令的执行
&& 也可以分隔多个命令,单只有前一个命令成功执行才会再执行下一个命令
> 输出重定向字符
< 输入重定向字符
>> 重定向追加字符
| 管道符,将一个命令的输出传送给另一个命令作为输入
& 位于命令行的末尾,表示后台处理,返回的是命令的PID
2.帮助命令
man 显示详细帮助。man查看的文档保存在usr/share/man目录下的各个子目录中以.gz格式存储。此外,还可以在usr/share/doc和usr/doc目录下找到大量的FAQs和How-To操作指南。也可以在命令后加--help选项来实现相同的功能.
whereis 用于查找命令,帮助信息等所在的位置。
info 用于显示命令相关的信息文档。已经被man代替,不推荐。
3.系统状态命令
w 查看当前使用系统的用户,也等同于who命令
date 显示当前日期和时间,例如date +'%Y-%m-%d %H:%M:%S'可以指定格式显示日期时间。注意:-d参数可以得到其他时间,例如:date -d "5 minute ago" +"%m-%d %H:%M",可以得到5分钟之前的时间,并按照指定格式输出。
cal 显示日历
env 显示所以环境变量,也多用于自动执行文件,类似于: #!/usr/bin/env ruby
4.通用命令
grep 它能使用正则表达式搜索文本并把匹配的行显示出来。选项-v只显示不匹配的行,-i匹配时忽略大小写。
sort 排序
uniq 去除重复,选项-d是只显示重复项
tee 把输出同时输出到标准输出和文件中
expr 进行数学运算
alias 为字符串或命令起别名,unalias禁止一个别名
history 显示已输入过的命令,使用!加命令号码可以重新执行该命令
times 后加命令可以显示该命令执行所用的时间
type 查询命令类型,是否是shell内建命令.
clear 清屏
export 导出变量,如添加新路径,但重启后就会恢复修改。
5.文件和目录操作命令
cd 切换目录。cd-返回上一个目录,cd~进入用户的home目录。
ls 目录列表。选项-a显示全部文件,-l显示长信息,-R递归列出所有子目录的内容,--sort=time按更新时间降序排序。注:alias ll='ls -l --color=tty'
mkdir 建立目录。
rmdir 删除目录。
rm 删除文件。选项-f强制删除,-i删除前给出提示信息,-r|-R递归删除所有子目录和文件。
cp 复制。选项-r|-R递归复制所有子目录和文件,-u不覆盖更新的文件,-b为被覆盖的文件创建备份(默认以~为后缀)。
mv 移动或重命名文件。
ln 建立连接文件.
chmod 改变文件的存取权限。a为所有用户,u为所有者,g为组用户,o为其他用户,对这几种范围可以使用+,-,=来设置r,w,x属性。-R来做递归修改。
umask 改变文件的默认存取权限
chown 改变文件的属主
chgrp 改变文件所属的组
touch 更新文件的时间标志或创建新文件
pwd 显示当前工作路径
cat 显示文件内容,选项-n显示行号,-s显示时合并多个空行为一个空行,-T将tab符显示为^I
more 按页显示文件内容,中途可以按q提前退出
less 按页显示文件内容,可以使用翻页键来前后翻页
wc 统计文件中的行数,单词数和字符数
find 查找文件。选项-name后可跟文件名的匹配模式,-iname则文件名忽略大小写,-exec cmd '{}' ';'使用每一个匹配的文件名作为参数执行指定的命令。其他常用参数:-group -user -nouser -empty -size +/-512k -amin -n -atime -n -mmin-n -mtime -n
locate 定位路径。支持多个搜索字符串和正则表达式匹配。
file 判断可执行文件的具体类型
strings 查找一个二进制文件中的可显示字符串
6.用户帐号管理命令
useradd 添加用户
passwd 为用户制定密码
userdel 删除用户,选项-r会删除该用户账户拥有的所有目录和文件
usermod 更改用户的设置
groupadd 增加一个用户组
groupdel 删除一个用户组
groupmod 更改一个用户组的设置
7.进程管理命令
nice 改变指定进程的优先级,优先级默认为10,值越小优先级越高
ps 对当前的进程状态进行快照并显示.
top 动态显示进程状态,选项-d指定刷新间隔,单位为秒
kill 杀死指定PID的对应进程,选项-9/-KILL是强行结束,-1/-HUP是重新运行,不加参数默认是-15/-TERM
8.磁盘和设备管理命令
df 检查文件系统的磁盘空间占用情况,选项-a显示所有文件系统
du 显示指定目录的磁盘空间的使用情况,选项-s只显示总数,-a递归显示所有文件和子目录,默认是只递归显示子目录
mount 加载设备,选项-t type dev dir用来加载设备的文件系统到指定的目录,type指定分区类型,vfat为FAT32或FAT16,ntfs为NTFS分区,-ocodepage=936,iocharset=cp936指定用中文显示文件名和目录。
例如:
加载U盘:mount /dev/sda1 /usb -ocodepage=936,iocharset=cp936。
加载软盘:mount /dev/df0 /mnt/floppy
加载光盘:mount /dev/cdrom /mnt/cdrom
如果需要开机时自动加载,需要把以上命令的参数加入etc/fstab
umount 卸载指定目录对应的文件系统
9.网络管理命令
nslookup 将域名解析为IP地址
ifcongfig 网络接口配置,可以配置IP地址,子网掩码等
route 路由配置
netstat 显示网络状态信息
ping ping命令,选项-c后跟测试次数
traceroute 跟踪路由,得到数据包从源主机到目标地址的路由信息
service 启动某个守护进程
arp 地址解析协议命令,选项-a可以显示当前访问的所有远程主机名,IP地址和硬件地址
telnet 远程登陆命令
ftp ftp命令
10.常用应用程序
vi 有三种模式:命令模式,文本输入模式,命令提示行交互模式。常用的编辑指令有:wq存盘退出,w FileName把缓冲区内容写入指定文件中,q!不存盘直接退出,n,mw FileName把n~m行写入指定文件中,n,mw>> Filename把n~m行追加到指定文件中。
emacs 是linux平台另一个流行文本编辑器
awk 可以对匹配模式的行进行指定的操作.命令的格式为awk -F [fild_separator] 'pattern {action} pattern {action}'input_file
sed 也是一个文本过滤工具.
tar 命令的常用选项有:c用于创建新的档案文件,t查看档案文件的内容,x从档案文件中释放文件,v显示命令处理的文件信息,f使用档案文件或设备,z使用gzip进行过滤处理。
使用举例:
tar cf my.tar /home 把/home目录下所有的文件和子目录打包成my.tar文件
tar tvf my.tar 查看my.tar文件的内容
tar xvf root/my.tar /home 把root目录下的my.tar文件展开到/home目录下
tar cfz my.tar.gz /home 使用gzip压缩的打包文件(也常用.tgz或.tar.z作为扩展名)
tar -cfz my.tar.gz --exlude myfile/log myfile 把当前目录下的myfile文件或文件夹压缩成my.tar.gz文件,而且,不包含myfile文件中的log文件或目录
tar tvfz my.tar.gz 查看my.tar.gz文件的内容
tar xvfz my.tar.gz /home 解压缩gzip的打包文件
gzip 该命令是linux下经常使用的压缩和解压缩工具,压缩后文件的扩展名默认为.gz。常用的选项有:-d解压缩(默认功能是进行文件压缩),--fast最快压缩,--best最好压缩。gunzip即对应gzip -d的命令,用来解压缩文件。
unzip 命令主要用于解压Windows平台下winzip压缩的文档,扩展名即为.zip。选项-P< >输入密码。
zip 命令则用于以winzip格式压缩多个文件。
uncompress 命令用于解压缩.Z格式的文档。
rpm 命令可以实现RPM软件包的安装、更新、卸载和检验等操作。常用的选项有:-i安装,-h安装时输出hash标记,-v显示附加信息,-q查询安装包的是否安装和版本信息,-e卸载安装包,-U升级安装。
举例如下:
rpm -ivh usermin.rpm 安装RPM软件包
rpm -q webmin 查询
rpm -e webmin 卸载RPM安装包
rpm -Uvh usermin.rpm 升级安装
apt 可以在制定软件包名称后自动下载更新的版本并解压缩,编译和安装。
yum 同上,可以自动更新程序的安装和配置
11.开放源代码的编译使用
在readme和install文档中一般都介绍了编译方法和安装步骤,列出了程序正常工作需要的其他程序、编译选项,以及默认安装位置等。一般步骤是:
./configure
make
make install
注意:在这种方式下,一般前两步用户权限就可以,而第三步需要root权限,否则无法写入/usr/bin等目录。解决办法是执行configure命令时添加--prefix=/home/my/tool --exec-prefix=/home/my/tool两个参数来指定目录。
★Red Hat Linux的图形界面
X Windows系统由许多部分组成,包括X服务器,X客户端,X协议,X开发库和X工具箱.和用户实现交互的是X客户端,它借助于X协议访问X服务器.在一个系统中可以拥有多个X客户端,但是只能运行一个X服务器.
Windows操作系统除98外操作系统和GUI界面是紧密耦合的,Linux中的字符界面和GUI界面是完全独立的.
在/etc/inittab文件里修改默认启动级别为5可以更改默认启动的用户界面.
X Windows在即插即用方面做了很大改进,可以自动识别需要mount的设备.
两种桌面风格:GNOME和KDE
常用应用程序:文件管理器Nautilus,运行对话框,搜索文件,运行终端,记事本gedit,系统监视器,包管理器,服务管理器,浏览器Firefox,办公软件OpenOffice包括Writer,Calc,Impress等,Wine模拟器模拟windows系统程序.
RedHat的shell界面中,用蓝色表示文件夹,青色表示链接文件,白色表示文件。
★文件布局详解
一、根目录详解
/usr 操作系统的命令,库和文档
/etc 系统配置文件,不包含可执行文件
/var 动态信息,如日志,临时文件,缓冲文件
/home 用户目录
/root root用户的主目录
/lib 库文件
/bin 标准命令文件
/sbin 系统管理命令
/opt 应用程序
/dev 设备文件
/mnt 挂接临时映射的文件系统
/tmp 临时文件夹,随时可清空
/boot 内核和引导加载器
/proc 用内存虚拟的文件系统,存放进程和系统信息
二、部分子目录详解
1./usr目录的子目录
bin 操作系统的命令
sbin 系统管理命令
local 用户自己新安装的软件
X11R6 与X Windows相关的内容
include C开发工具需要的头文件
share 共享目录,如帮助手册和技术文档
2./var目录的子目录
log 日志文件
spool 缓冲文件
local 安装程序产生的中间数据
run 系统运行期间的有关系统信息
tmp 临时文件夹
3./dev目录的子目录
hd[s][d] s为a,b,c,d等表示第n块IDE硬盘驱动设备,d为1,2,3,4,5等表示第n个分区
sd[s][d] s为a,b,c,d等表示第n块SCSI硬盘驱动设备,d为1,2,3,4,5等表示第n个分区
ttyS[d] d为1,2,3,4表示COM1~COM4设备
lp0 并口设备
null 空设备,用于屏蔽输出消息或者删除不需要的文件
4./proc目录的内容
version 保存了Linux核,gcc等版本号
cpuinfo CPU信息
meminfo 内存状态的信息
stat 这个文件包含的信息有CPU利用率,磁盘,内存页,内存对换,全部中断,接触开关以及上次自举时间(自1970年1月1日起的秒数)
uptime 自从上次系统自举以来的秒数,以及其中有多少秒处于空闲
loadavg 给出以几个不同的时间间隔计算的系统平均负载
devices 字符和块设备的主设备号和设备名称
modules 可加载内核模块的信息
mounts 给出当前系统所安装的文件系统信息
dma DMA通道和驱动程序名称
pci 给出PCI设备的信息
ioports 设备的I/O端口范围
kcore 物理内存以core文件格式保存的二进制格式文件
filesystems 可供使用的文件系统类型
interrupts 中断号和发生中断次数
数字n 该文件夹存储了pid和数字n相同的应用进程的信息,包括该应用进程的可执行文件的所在路径都可以在这里查到
5.Bash配置:
~/.bash_profile 是交互式、login方式进入 bash运行的
~/.bashrc 是交互式 non-login方式进入 bash运行的
通常二者设置大致相同,所以通常前者会调用后者。
使用source命令可以不重启而令配置文件立刻生效
source FileName作用:在当前bash环境下读取并执行FileName中的命令。source在当前bash环境下执行命令,而scripts是启动一个子shell来执行命令。这样如果把设置环境变量(或alias等等)的命令写进scripts中,就只会影响子shell,无法改变当前的BASH,所以通过文件(命令列)设置环境变量时,要用source 命令。
6.重要配置文件
/etc/inittab 用来保存默认启动的运行级别,设置为5可直接进入X窗口。
/etc/fstab 用来存放文件系统的静态信息的文件,自动挂载文件系统应该修改此文件。
/etc/resolv.conf 编辑DNS地址
/etc/sysconfig/network 修改主机名
/etc/sysconfig/network-scripts/ifcfg-eth0编辑IP地址,掩码和网关。可以使用netconfig命令来在文本图形界面里设置该文件和DNS地址的文件。
/etc/profile 所有用户的配置文件,可以把export语句加入这里来为所有用户添加环境变量。
7.重要的环境变量
PATH 可执行文件搜索路径,一般用export PATH=$PATH:/newpath来添加新路径
LANG 显示语言。LANG=UTF-8可以正常显示英文。在X窗口的终端里可以设置LANG=zh_CN.UTF-8显示中文。在纯控制台下是不可以简单通过设置LANG来显示中文的。
★VMWare网络配置
1.桥接方式(bridge) :
默认使用vmnet0
将虚拟机的ip设置与主机同网段未使用ip,其余与主机相同:
ip地址与主机同段相异,子网掩码,网管,DNS服务器与主机相同。
实现虚拟机<--->主机虚拟机<---->互联网通信。
2.共享方式(nat) :
默认使用vmnet8
将虚拟机设置成使用DHCP方式上网,windows下选择"自动获取ip",linux下开启DHCP服务即可。
3.私有方式(host-only):
默认使用vmnet1
将虚拟机ip设置与vmnet1同网段,gateway设置成vmnet1的ip,其余设置与vmnet1相同,DNS设置与主机相同
这样就实现了虚拟机<--->主机 通信,但是虚拟机<--->互联网 仍无法通信
★工作中常用的命令详解
1.从其他机器拷贝文件夹
格式: scp -r 文件夹名 用户名@机器名:/路径
范例: scp -r searchwork@zjm-testing-ps23.zjm.baidu.com:/home/work/
格式:wget <url>
范例:wgetftp://zjm-testing-ps23.zjm.baidu.com//home/work/search
说明:下载远程ftp或http服务器的文件到本地当前目录
2.查看哪个程序在用特定端口
格式: netstat -eap | grep 端口号
范例: netstat -eap | grep 8080
注,有时间会改方式无法看到某些端口号,则使用如下命令:
netstat -na | grep 端口号
3.实时监控日志文件内容
格式: tail -f 日志文件名
范例: tail -f ui.log | grep 'hello'
说明:这显示ui.log文件的最后十行中含有hello字符串的行。tail命令继续显示添加到ui.log文件中的并且含hello字符串的行。显示会一直继续,直到您按下Ctrl-C按键顺序来停止
4.查看指定用户拥有的进程
格式: pstree 用户id
范例: pstree work
说明:显示work用户正在运行的各进程之间的继承关系,以树状结构方式列出
5.查看磁盘空间使用情况
格式: df -h
6.查找某文件中出现指定字符串的行
格式: grep 指定字符串 文件名
范例: grep 电视剧夏天的味道 ui.log
说明: 找出日志文件ui.log中包含“电视剧夏天的味道”的行
范例:grep --include *.{c,cpp} --exclude ‘common.c’ -r “function”./*
说明:在当前目录下循环查找子目录里,所有c或cpp文件,且非common.c文件中,包含function字符串的文件。
进阶:-A n显示匹配行和其之后的n行,-B显示匹配行和之后的n行,-C显示匹配行和以其为中心的n行。
7.查看内存使用情况
格式: free
8.查看本机系统内核
格式: uname -a
9.查看当前路径下的文件/文件夹大小
格式: du -sh 文件名/文件夹名
10.变更为其它使用者的身份
格式: su 使用者帐号
范例: su work
11.远程登陆
格式: ssh 用户名@机器名
范例: ssh rd@build01
12.不挂断地运行命令(即使关闭终端连接)
格式: nohup command &
范例: nohup ./build_index.sh -d ../newdbi/ &
高级:使用screen命令可以在新窗口运行shell,并且在从远程终端退出后,仍然可以在保持窗口的状态,再以后时再次进入。
格式: screen #进入窗口(新建一个窗口)
格式: screen -list #显示当前后台(Detached)所有的窗口,格式为<session id>.<session name>例如:29334.screensession
格式: screen -r [session id]
进入窗口后:
使用exit命令退出当前窗口;
使用Ctrl+A后,输入?显示帮助,帮助中命令均要使用Ctrl+A后再去输入
使用Ctrl+A后,输入d将当前窗口Detached,回到原来的环境
使用Ctrl+A后,输入a将执行Ctrl+A的组合键功能
修改配置文件(位于~/.screenrc)进行功能加强:
#启动时不显示欢迎屏幕
startup_message off
term linux
# 定义screen的功能键为Ctrl-Z。向终端输入Ctrl-Z时应按 Ctrl-Z z。
#escape ^Zz
##设置屏幕缓冲区为4096行
defscrollback 4096
#设置状态栏
hardstatus on
hardstatus alwayslastline
shelltitle "$|bash"
hardstatus string '%{= kG}[ %{G}%c:%s %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][ %{C}(F1)New (F2)Rename (F3)Monitor (F4)Slience %{g}][%{kB} %d/%m %{w}%c %{g}]'
##shutdown the noise
vbell off
## w to show the window list
bind w windowlist -b
bind ^w windowlist -b
##初始化显示4个窗口,默认选择窗口0
screen
screen
screen
screen
select 0
#进行快捷键的绑定:k1-k9表示功能键F1-F9,F1、F2表示功能键F11、F12
bindkey -k k1 screen
bindkey -k k2 title
bindkey -k k3 monitor
bindkey -k k4 silence
bindkey -k k5 colon
#bindkey -k k6 split
#bindkey -k k; focus
bindkey -k k7 focus
#bindkey -k k8 only
bindkey -k k9 detach
bindkey -k F1 prev
bindkey -k F2 next
attrcolor u "-u B"
sessionname screensession
autodetach on
13.查看文件的行数
格式: wc -l 文件名
范例: wc -l as.conf
14.比较两个文件的不同之处
格式: diff 文件1文件2
-u 以统一的格式来展示。输出格式如下:@@ -127,10 +127,6 @@表示此段显示前一个文件(---)的127行开始的10行,后一个文件(+++)的127行开始的6行,在展示时,如果此行前面为-号表示只在前一个文件(---)中出现,前面为+号表示只在后一个文件(+++)中出现,前面为空格表示在两个文件中都出现。
-b 忽略空格造成的不同。
-B 忽略空行造成的不同。
-I:忽略大小写的变化。
-y 以并列的方式显示文件的异同之处。
-W<宽度> 在使用-y参数时,指定栏宽。
-u 以合并的方式来显示文件内容的不同。
-c 显示全部内容,并标出不同之处。
-q 只显示不同的文件名
diff -ruN <文件名> <文件名> > <补丁文件名>
注:vimdiff命令请参考vim的split命令。
15.杀死进程
格式: killall -9 进程名
范例: killall -9 bs.se
16.在SecureCRT中把文件传给本机的‘我的文档’目录下
格式: sz 文件名 #注:本机的保存位置,是由SecureCRT的配置项决定的
范例: sz 1.txt
17.把本机文件传给SecureCRT中当前机器的当前目录
格式: rz -be
18.Vi文本编辑器
H 光标移至屏幕顶行
nG 光标移至第n行首,等同于::n;移到文件头使用1G,移到文件尾使用G。
n+ 光标下移n行
n- 光标上移n行
nz 将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。
x/X 删除光标后/光标前的字符(前面可加数字表示删除的字符个数)
dd 剪切行(前面可加数字表示删除的行数,前面加字母表示复制到哪个缓冲区)
yy 复制行(前面可加数字表示复制的行数,前面加字母表示复制到哪个缓冲区)
yw 复制一个word
p 贴在游标后(整行复制则是下一行,前面加字母表示从哪个缓冲区复制)
P 贴在游标前(整行复制则是上一行,前面加字母表示从哪个缓冲区复制)
u 撤销命令
输入:后可以使用的命令有:
split [file] 水平分割,不接文件则新窗口显示当前文件。Ctrl+W,然后按方向键可以切换窗口。
vsplit [file] 垂直分割
diffsplit [file] 比较并水平分割
vertical diffsplit [file] 比较并垂直分割
比较并分割的具体命令:1.将光标移动到蓝色区后,输入 do或者 dp,do表示将以对比的文件为标准来修改当前文件中光标所在的不同之处
dp表示以当前文件为标准,来修改对比文件中的差异之处。2.从一个差异移动到另一个差异的方法有: n[c移动到上一个差异,移动n此,如果要向下移动则使用: n]c
#,# copy/move # 把行号#,#之间的行区域复制/移动到行号#
w 保存
x 保存并退出
q! 直接退出不保存
/word 查找
#,#s/old/new/g 替换命令,"#,#"表示两个行号之间的行区域,"old"指被替换的字符串,"new"替换成哪个字符串
%s/old/new/g 整篇替换命令
:set nu 显示行号
:set fileencoding 查看文件编码格式。
:set list/nolist 显示所有字符/隐藏不可见字符
set all 显示所有支持的vi环境变量,这些变量均可以使用set <env_var>来显示,使用set <env_var> <value>来设置新值
配置文件设置:(即~/.vimrc,默认不存在,自己新建即可)
colorscheme desert "设置背景
syntax on "自动语法高亮,也就是有多种颜色了
解决乱码(其实是GBK编码显示乱码问题)的一套方案(放于.vimrc的最顶端)
set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1
set encoding=utf-8
set termencoding=cp936
language messages zh_CN.UTF-8
自动将TAB符以4个空格替换,并且将文件中TAB符以4个空格长度表示(默认为8个),该设置只对ruby和rb类型的文件生效:
autocmd FileType rb,ruby set tabstop=4 | set shiftwidth=4 | set expandtab
view xxx.txt 等价于 vi -R xxx.txt : 以只读方式打开文件
19.察看文件类型
格式:file 文件名
20.文本抽取
见awk命令专题总结
21.非交互性文本流编辑器
见sed命令专题总结
22.将文件中的记录分类
格式:sort [选项]–o输出文件名 [其他选项] +pos1+pos2输入文件名
参数:
-c 测试文件是否已经分类
-m 合并两个分类文件
-u 删除所有复制行
-o 存储sort结果的输出文件名
其它参数有:
-b 使用域进行分类时,忽略第一个空格。
-n 指定分类是域上的数字分类。
-t 域分隔符;用非空格或t a b键分隔域。
-r 对分类次序或比较求逆。
+n n为域号。使用此域号开始分类。
n n为域号。在分类比较时忽略此域,一般与+ n一起使用。
pos1,pos2 传递到m,n。m为域号,n为开始分类字符数;例如4,6意即以第5域分类,从第7个字符开始。
范例:sort -t: +2n video.txt 以“:”为域分割符,按第三个域数字分类video.txt
23.去除文本文件的重复行
格式:uniq [选项]输入文件 [输出文件]
参数:
-u 只显示不重复行。
-d 只显示有重复数据行,每种重复行只显示其中一行
-c 打印每一重复行出现次数。
-f n为数字,前n个域被忽略。一些系统不识别- f选项,这时替代使用- n。
范例:uniq –n2 parts.txt
-s n为数字,前n个字符被忽略。
-w n为数字,只比较n个字符
24.连接两个文本文件
格式:join [选项]文件1文件2
说明:join用来将来自两个文本文件的行连在一起,两个输入文件必须已经分过类,每个文件里都有一些元素与另一个文件相关,由于这种关系,join将两个文件连在一起。
参数:
-an n为一数字,用于连接时从文件n中显示不匹配行。例如, - a 1显示第一个文件的不匹配行,- a 2为从第二个文件中显示不匹配行。
-o n.m n为文件号,m为域号。1 . 3表示只显示文件1第三域,每个n,m必须用逗号分隔,如1 . 3,2 .1。
-j n m n为文件号,m为域号。使用其他域做连接域。
-t 域分隔符。用来设置非空格或t a b键的域分隔符。例如,指定冒号做域分隔符- t:
范例: join –o 1.1,2.2 names.txttown.txt
25.从文本文件中剪切列或域
格式:cut [选项] 文件名
参数:
-c list 指定剪切字符数。
-f field 指定剪切域数。
-d 指定与空格和tab键不同的域分隔符。
- c用来指定剪切范围,如下所示:
- c 1,5-7 剪切第1个字符,然后是第5到第7个字符。
-f 格式与- c相同。
-f 1,5 剪切第1域,第5域。
范例: cut –d: -f3 pers
26.将两个文本文件粘贴在一起
格式:paste [options] file1 file2
说明:粘贴两个不同来源的数据时,首先需将其分类,并确保两个文件行数相同。paste将按行将不同文件行信息放在一行。缺省情况下, paste连接时,用空格或tab键分隔新行中不同文本,除非指定-d选项,它将成为域分隔符。
参数:
-d 指定不同于空格或t a b键的域分隔符。例如用@分隔域,使用- d @。
-s 将每个文件合并成行而不是按行粘贴。
范例: paste –d: pas2 pas1 用冒号作分割符
27.将大文件进行分割
格式:split [选项]输入文件名 输出文件名前缀
参数:-a 指定后缀的长度(缺省为2)
-b 每个输出文件的字节大小
-l 每个输出文件的行数
-d 后缀以数字形式排序
范例:split –l 1000 bigfile.txtoutfile
进阶:csplit可以支持更多的筛选功能,例如:csplitserver.log /SERVER/ -n 2 -s {*} -f server -b “%02d.log”这个命令的意思是把server.log文件以包含/SERVER/的行进行分离为文件server01.log、server02.log等,并且{*}表示全部都分割。
29.查找文件
格式:find 查找路径 -iname/-name字符串
范例:find . -iname "*hello*" 2>/dev/null
说明:在当前路径下找到文件名包含hello字符串(不区分大小写)的文件。后面的输出表示不显示Permission denied的行。
范例:find . −name“∗.txt”−or−name“∗.pdf”
说明:查找以txt或者pdf结尾的文件
范例:find . -type f -maxdepth 1 -user work -exec cp {}{}.bak \;
说明:把当前目录下的文件全部做一个以.bak结尾的备份
进阶: -not否定条件,-and交集条件,-path限定路径,-mindepth限定最小路径深度,-maxdepth限定最大路径深度,-type指定搜索的文件类型(f/l/d/c/b/s/p),-atime/mtime/ctime +/-n文件在n天之前/或之内,被访问过/内容被修改过/状态发生了变化,-amin/mmin/cmin +/-n同前,只是单位为分钟,-size +/-n(b/c/w/k/M/G)文件的体积大于/小于n单位,-perm指定权限,-user指定用户
30.压缩包操作
打包:tar cvf 文件名.tar 文件
解包:tar xvf 文件名.tar
打压缩包:tar zcvf 文件名.tar.gz 文件
解压缩包: tar zxvf 文件名.tar.gz
解zip压缩包:unzip文件名.zip
31.计算文件的md5码
格式:md5sum 文件名 >保存md5码的文件名
范例:md5sum download.xml > download.xml.md5
范例:md5sum -c download.xml.md5
说明:校验md5是否正确
进阶:计算和校验sha1码的命令是sha1sum,用法类似。
32.向服务器发送POST或GET请求
格式:curl -d POST参数 url地址
范例:curl -d 'username=xx&passwd=mypd'http://www.baidu.com/login
范例:curl "http://www.baidu.com" #get方式
范例:curl -i -H 'Content-Type:application/json;charset=UTF-8' --data-ascii '{key1:val1, key2:val2}' 'http://www.sample.com/deal.php' #jason方式,可以使用--data-ascii参数来POST纯文本的数据;-i来显示HTTP头
范例:curl -F 'key1=val1' -F 'key2=val2' -F 'filekey=@file_fullpath' 'http://www.sample.com/deal.php' #上传文件,会自动添加Content-Type: multipart/form-data; boundary=----------------------------长度
33.将上一个命令的结果作为参数,分组使用进行操作
格式:前一个命令 | xargs -i -t -n1 <命令和参数>
范例:find . -iname '*openmobile*' | xargs -i -t -n1 cp {} {}.bak
说明:把当前目录的文件名含有openmobile的文件,全部做个备份,生成对应的'文件名.bak'文件。其中{}引用了上一个命令的结果,n1表示如何使用上一个命令的结果,n1为执行一次命令使用1个结果值,n2为执行一次命令使用2个结果值,例如find . -iname 'openmobile*' | xargs -i -t -n2 diff –q
34.录制执行命令的脚本为文本文件
格式:script 文件名
范例:script cmdlines.txt
说明:执行exit命令或ctrl-D命令结束录制,录制的命令和输出结果会存储在cmdlines.txt文件中。
35.替换操作
格式:tr 字符集1 字符集2
范例:echo “HELLO WORLD | tr ‘A-Z’ ‘a-z’
说明:把大写转换为小写
进阶:-s删除掉重复的 字符集1中的字符(只保留第一次出现的那个字符),-d删除掉 字符集1中的字符。
36.文件名操作
格式:rename ‘模式’文件
范例:rename ‘s/ /_/g’ *.txt
范例:rename ‘y/A-Z/a-z/’ *
范例:file_jpg=”sample.jpg”;name=${file_jpg%.*};extension=${file_jpg##*.}
说明:%非贪婪从右至左匹配,%%贪婪从右至左匹配,#非贪婪从左至右匹配,##贪婪从左至右匹配
37.检查拼写
格式:aspell -l 或 aspell -c文件名
范例:echo hello | aspell -l
格式:look 单词
范例:look - hello
说明:列出所有以’hello’开头的单词
38.查找两个文件内容相同的行
格式:comm 文件1 文件2 -1 -2 -3
范例:sort A.txt -o A.txt; sort B.txt -o B.txt; comm. A.txtB.txt -1 -2
说明:显示A.txt和B.txt内容相同的行;comm的输入文件必须先sort,结果显示为3列,第1列为只在A文件有,第2列为只在B文件有,第3列为在A、B文件都有的行,三个列之间用tab分割。-1,-2,-3的参数分别表示不显示第1列,第2列和第3列。
39.对文本文件按行进行循环处理
范例:...(cat filename) | (while read line; do echo $line; done)
范例:
while read line
do
echo $line
done < filename(待读取的文件)
40.倒序单词或字符
格式:rev 字符串
格式:tac 字符串
范例:echo "hello world" | tac -s ' ' | tr '\n' ' '
说明:把单词倒序,tac默认是倒序行,此处指定分隔符为空格;rev是倒序每个字符。
41. 添加定时任务
格式:crontab -e
说明:执行文字编辑器来设定时程表。时程表格式如下:“f1 f2 f3 f4 f5 program”,其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天(星期天为0,星期一为1,...,星期六为6)。program 表示要执行的程式。
fx的表示说明:当 f1 为 * 时表示每分钟都要执行 program;当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行;当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次;当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行。
其他参数: -l 列出目前的时程表
范例:0 2 * * * cd /home/mysql/dbproxy/log && find . -mtime +30 -exec rm -rf {} \;
说明:每天凌晨2点定期删除30天以前的日志文件
42. core文件的设置
格式:ulimit -a #显示当前core文件的相关设置,例如:开启或关闭core文件的生成
/proc/sys/kernel/core_uses_pid可以控制产生的core文件的文件名中是否添加pid作为扩展,如果添加则文件内容为1,否则为0
/proc/sys/kernel/core_pattern可以设置格式化的core文件保存位置或文件名,比如可以这样设置:/home/coresave/core.%e.%p.%t
43. 执行脚本的绝对路径
#获取当前执行的脚本文件所在的绝对路径:
sh_dir_tmp=`dirname "$0"`
sh_dir=`cd "$sh_dir_tmp"; pwd`
#`basename "$0"`来获取当前执行的脚本文件的文件名
44. 调试shell命令
选项-x 进入跟踪方式,显示所执行的每一条命令;-n 只读取shell脚本,测试shell脚本是否存在语法错误,但不实际执行。
“-x”选项使shell在执行脚本的过程中把它实际执行的每一个命令行显示出来,并且在行首显示一个"+"号。 "+"号后面显示的是经过了变量替换之后的命令行的内容,有助于分析实际执行的是什么命令。先执行export PS4='+{$LINENO:${FUNCNAME[0]}} ', 然后再使用“-x”选项来执行脚本,就能在每一条实际执行的命令前面显示其行号以及所属的函数名。
对于使用-x得到的+输出,是无法通过重定向命令保存的,也不可以使用管道+more命令来分页查看;可以使用录制命令来保存输出结果到文件中再自行查看,即:script 文件名,exit结束录制。
shell的执行选项除了可以在启动shell时指定外,亦可在脚本中用set命令来指定。 "set -x"表示启用调试选项,"set +x"表示关闭调试选项,这2个标记之间的内容为被跟踪的代码段。
调试钩子,例如以下的DEBUG函数,可以通过DEBUG <命令>的方式来调用,例如:“DEBUG set -x”;并且在执行时使用export DEBUG=true来打开。
- DEBUG()
- {
- if [ "$DEBUG" = "true" ]; then
- $@
- fi
- }