`

ubuntu常用命令

阅读更多
I  am so sorry that i pick up this article from the webstie

http://forum.ubuntu.org.cn/viewtopic.php?f=86&t=59426&start=0

Ubuntu常用命令

引用
sudo apt-get install 软件名 安装软件命令

sudo nautilus 打开文件(有root权限)

su root 切换到“root”



ls 列出当前目录文件(不包括隐含文件)

ls -a 列出当前目录文件(包括隐含文件)

ls -l 列出当前目录下文件的详细信息



cd .. 回当前目录的上一级目录

cd - 回上一次所在的目录

cd ~ 或 cd 回当前用户的宿主目录

mkdir 目录名 创建一个目录

rmdir 空目录名 删除一个空目录

rm 文件名 文件名 删除一个文件或多个文件

rm -rf 非空目录名 删除一个非空目录下的一切



mv 路经/文件 /经/文件 移动相对路经下的文件到绝对路经下

mv 文件名 新名称 在当前目录下改名

find 路经 -name “字符串” 查找路经所在范围内满足字符串匹配的文件和目录



fdisk fdisk -l 查看系统分区信息

fdisk fdisk /dev/sdb 为一块新的SCSI硬盘进行分区

chown chown root /home 把/home的属主改成root用户

chgrp chgrp root /home 把/home的属组改成root组



useradd 创建一个新的用户

groupadd 组名 创建一个新的组

passwd 用户名 为用户创建密码

passwd -d用户名 删除用户密码也能登陆

passwd -S用户名 查询账号密码

usermod -l 新用户名 老用户名 为用户改名

userdel–r 用户名 删除用户一切



tar -c 创建包 –x 释放包 -v 显示命令过程 –z 代表压缩包

tar –cvf benet.tar /home/benet 把/home/benet目录打包

tar –zcvf benet.tar.gz /mnt 把目录打包并压缩

tar –zxvf benet.tar.gz 压缩包的文件解压恢复

tar –jxvf benet.tar.bz2 解压缩



make 编译

make install 安装编译好的源码包

reboot Init 6 重启LINUX系统

halt Init 0 Shutdown –h now 关闭LINUX系统



uname -a 查看内核版本

cat /etc/issue 查看ubuntu版本

lsusb 查看usb设备

sudo ethtool eth0 查看网卡状态

cat /proc/cpuinfo 查看cpu信息

lshw 查看当前硬件信息

sudo fdisk -l 查看磁盘信息

df -h 查看硬盘剩余空间

free -m 查看当前的内存使用情况

ps -A 查看当前有哪些进程

kill 进程号(就是ps -A中的第一列的数字)或者 killall 进程名( 杀死一个进程)

kill -9 进程号 强制杀死一个进程



常用apt命令:



apt-cache search package 搜索包

apt-cache show package 获取包的相关信息,如说明、大小、版本等

sudo apt-get install package 安装包

sudo apt-get install package - - reinstall 重新安装包

sudo apt-get -f install 修复安装”-f = –fix-missing”

sudo apt-get remove package 删除包

sudo apt-get remove package - - purge 删除包,包括删除配置文件等

sudo apt-get update 更新源

sudo apt-get upgrade 更新已安装的包

sudo apt-get dist-upgrade 升级系统

sudo apt-get dselect-upgrade 使用 dselect 升级

apt-cache depends package 了解使用依赖

apt-cache rdepends package 是查看该包被哪些包依赖

sudo apt-get build-dep package 安装相关的编译环境

apt-get source package 下载该包的源代码

sudo apt-get clean && sudo apt-get autoclean 清理无用的包

sudo apt-get check 检查是否有损坏的依赖



清理所有软件缓存(即缓存在/var/cache/apt/archives目录里的deb包 )

sudo apt-get clean



删除系统不再使用的孤立软件

sudo apt-get autoremove






20100902 linux 学习-----------  tomcat 控制台查看


引用



用远程登陆客户端登陆linux

进入tomcat/logs/文件夹下

键入指令:tail -f catalina.out



[code="java"]tail [  -f ] [  -c Number |  -n Number |  -m Number |  -b Number |  -k Number ] [ File ]
或者
tail [  -r ] [  -n Number ] [ File ]



[code="java"]tail 命令从指定点开始将 File 参数指定的文件写到标准输出。如果没有指定文件,则会使用标准输入。
Number 变量指定将多少单元写入标准输出。 Number 变量的值可以是正的或负的整数。如果值的前面
有 +(加号),从文件开头指定的单元数开始将文件写到标准输出。如果值的前面有 -(减号),则从
文件末尾指定的单元数开始将文件写到标准输出。如果值前面没有 +(加号)或 -(减号),那么从文
件末尾指定的单元号开始读取文件。

-b Number 从 Number 变量表示的 512 字节块位置开始读取指定文件。
-c Number 从 Number 变量表示的字节位置开始读取指定文件。
-f 如果输入文件是常规文件或如果 File 参数指定 FIFO(先进先出),那么 tail 命令不会在复制了输入文件的最后的指定单元后终止,而是继续从输入文件读取和复制额外的单元(当这些单元可用时)。如果没有指定 File 参数,并且标准输入是管道,则会忽略 -f 标志。tail -f 命令可用于监视另一个进程正在写入的文件的增长。
-k Number 从 Number 变量表示的 1KB 块位置开始读取指定文件。
-m Number 从 Number 变量表示的多字节字符位置开始读取指定文件。使用该标志提供在单字节和双字节字符代码集环境中的一致结果。
-n Number 从首行或末行位置来读取指定文件,位置由 Number 变量的符号(+ 或 - 或无)表示,并通过行号 Number 进行位移。
-r 从文件末尾以逆序方式显示输出。-r 标志的缺省值是以逆序方式显示整个文件。如果文件大于 20,480 字节,那么-r标志只显示最后的 20,480 字节。 -r 标志只有与 -n 标志一起时才有效。否则,就会将其忽略。


引用



应用实例



    * 默认显示档案 access_log 最后10行的内容。



#tail access_log



    * 如果只需要显示2行,可以使用-n选项来指定,如下



# tail -n 2 access_log



    * 如果有时"监视"档案变动的需求,譬如短暂性的监视 httpd 的access_log 的变动.可以使用-f选项。



# tail -f access_log

这种做法也使用于一个以上的档案监视。用Ctrl+c来终止。









2010 09 02  linxu学习 内核查看

引用





如何得知自己正在使用的linux是什么版本呢,下面的几种方法将给你带来答案!



  1. 查看内核版本命令:



  1) [root@q1test01 ~]# cat /proc/version



   Linux version 2.6.9-22.ELsmp (bhcompile@crowe.devel.redhat.com) (gcc version 3.4.4 20050721 (Red Hat 3.4.4-2)) #1 SMP Mon Sep 19 18:00:54 EDT 2005



  2) [root@q1test01 ~]# uname -a



  Linux q1test01 2.6.9-22.ELsmp #1 SMP Mon Sep 19 18:00:54 EDT 2005 x86_64 x86_64 x86_64 GNU/Linux



  3) [root@q1test01 ~]# uname -r



  2.6.9-22.ELsmp



  2. 查看linux版本:



  1) 登录到服务器执行 lsb_release -a ,即可列出所有版本信息,例如:



  [root@3.5.5Biz-46 ~]# [root@q1test01 ~]# lsb_release -a



  LSB Version: :core-3.0-amd64:core-3.0-ia32:core-3.0-noarch:graphics-3.0-amd64:graphics-3.0-



  ia32:graphics-3.0-noarch



  Distributor ID: RedHatEnterpriseAS



  Description: Red Hat Enterprise Linux AS release 4 (Nahant Update 2)



  Release: 4



  Codename: NahantUpdate2



  注:这个命令适用于所有的linux,包括Redhat、SuSE、Debian等发行版。



  2) 登录到linux执行cat /etc/issue,例如如下:



  [root@q1test01 ~]# cat /etc/issue



  Red Hat Enterprise Linux AS release 4 (Nahant Update 2)



  Kernel \r on an \m



  3) 登录到linux执行cat /etc/redhat-release ,例如如下:



  [root@q1test01 ~]# cat /etc/redhat-release



  Red Hat Enterprise Linux AS release 4 (Nahant Update 2)



  注:这种方式下可以直接看到具体的版本号,比如 AS4 Update 1



  4)登录到linux执行rpm -q redhat-release ,例如如下:



  [root@q1test01 ~]# rpm -q redhat-release



  redhat-release-4AS-3



  注:这种方式下可看到一个所谓的release号,比如上边的例子是3



  这个release号和实际的版本之间存在一定的对应关系,如下:



  redhat-release-3AS-1 -> Redhat Enterprise Linux AS 3



  redhat-release-3AS-7.4 -> Redhat Enterprise Linux AS 3 Update 4



  redhat-release-4AS-2 -> Redhat Enterprise Linux AS 4



  redhat-release-4AS-2.4 -> Redhat Enterprise Linux AS 4 Update 1



  redhat-release-4AS-3 -> Redhat Enterprise Linux AS 4 Update 2



  redhat-release-4AS-4.1 -> Redhat Enterprise Linux AS 4 Update 3



  redhat-release-4AS-5.5 -> Redhat Enterprise Linux AS 4 Update 4












[size=medium;]2010年9月7日学习心得[/size]





2010 年 9月6日晚  装ssh



安装OpenSSH

Ubuntu缺省没有安装SSH Server,使用以下命令安装:



sudo apt-get install openssh-server openssh-client



不过Ubuntu缺省已经安装了ssh client。



可以通过编辑 /etc/ssh/sshd_config 文件来配置 OpenSSH

udo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.original

sudo chmod a-w /etc/ssh/sshd_config.original



配置完成后重起:

sudo /etc/init.d/ssh restart

[code="java"] ps -ef | grep lottery1 查看包含lottery1  进程



2010年9月22日星期三
创建文件夹


[code="java"]ubuntu文件夹的创建与删除

mkdir 目录名 创建一个目录
rmdir 空目录名 删除一个空目录
rm 文件名 文件名 删除一个文件或多个文件
rm -rf 非空目录名 删除一个非空目录下的一切


2010年9月26日


[code="java"]Linux系统查看进程信息相关命令:

ps –aux

查看进程的命令有很多,我只是列出了我最常用的几个。

netstat –tln //查看服务监听端口

netstat      //查看进程号

ps –aux     //查看进程号

ps –aux | more //全部查看

ps –ef | grep mysql //查看mysql的进程

kill -9 3306 //强制杀掉进程号3306

防火墙的设置

设置防火墙: setup

查看防火墙设置: iptables –L

关闭防火墙:     iptables -F

2010年9月26日 apache  tomcat 整合 1



[code="java"]安装Apache
1. 将httpd-2.2.15.tar.gz解压,执行如下命令
tar zxvf httpd-2.2.15.tar.gz
2. 进入解压后的目录中,执行如下命令进行配置
linux-h5yk:/usr/local/httpd # ./configure
注意:
此步骤时间较长,请耐心等待
3. 编译源代码,执行如下命令
linux-h5yk:/usr/local/httpd # make
注意:
此步骤时间较长,请耐心等待
4. 开始安装Apache,执行如下命令
linux-h5yk:/usr/local/httpd # make install

注意
./configure是用来检测你的安装平台的目标特征的。比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本
make是用来编译的,它从Makefile中读取指令,然后编译。
make install是用来安装的,它也从Makefile中读取指令,安装到指定的位置

Apache、Tomcat整合
 
1. 将mod_jk-apache-2.2.4.so文件拷贝到apache的安装目录的modules中。
2. 修改Tomcat设置
进入$TOMCAT_HOME/conf目录,创建文件workers.properties,内容如下(附件如上)
# TOMCAT_HOME
workers.tomcat_home=/usr/local/tomcat

# JAVA_HOME
workers.java_home=/home/epim/java

# 名字要和httpd.conf的一致。如果这里改了httpd.conf也要改
worker.list=ajp13

# 工作端口,tomcat的jk监听端口
worker.ajp13.port=8009

# TOMCAT主机
worker.ajp13.host=localhost

#
worker.ajp13.type=ajp13

# 负载平衡因子
worker.ajp13.lbfactor=1

3. 修改Apache设置
修改apache安装目录下conf目录下的httpd.conf,增加如下配置


[code="java"]将Listen 80 修改为 Listen 127.0.0.1:80

将ServerName 修改为 ServerName LocalHost:80

在DirectoryIndex中添加 index.jsp

我的网页放在/var/www下,所以要修改DocumentRoot

DocumentRoot "/var/www"

Options Includes FollowSymLinks
AllowOverride None
Order deny,allow
Allow from all
XBitHack on

Order deny,allow
Deny from all


[code="java"]LoadModule jk_module modules/mod_jk-apache-2.2.4.so
JkWorkersFile /usr/local/tomcat/conf/workers.properties
JkLogFile /usr/local/apache2/logs/mod_jk.log
JkMount /*.jsp ajp13
JkMount /*.do ajp13
4. 重新启动apache和tomcat,即可测试

2010.9.30 号记录


直接运行命令:nohup java -cp :/usr/java/jdk1.6.0_17/lib:/usr/java/jdk1.6.0_17/jre/libexport:../lib/activation-1.1.jar:../lib/activation.jar:../lib/axis-ant.jar:../lib/axis.jar:../lib/bcprov-jdk14-119.jar:../lib/classes12.jar:../lib/commons-beanutils-1.7.0.jar:../lib/commons-beanutils.jar:../lib/commons-codec-1.3.jar:../lib/commons-codec-1.3-sources.jar:../lib/commons-collections-3.1.jar:../lib/commons-collections-3.2.jar:../lib/commons-digester-1.8.jar:../lib/commons-discovery-0.2.jar:../lib/commons-httpclient-3.0.1.jar:../lib/commons-lang.jar:../lib/commons-logging-1.0.4.jar:../lib/commons-logging-1.1.1.jar:../lib/commons-logging-1.1.jar:../lib/commons-logging-api.jar:../lib/commons-logging.jar:../lib/dom4j-1.6.1.jar:../lib/dom4j-full.jar:../lib/hiencrypt.jar:../lib/hiiposm_engine_1.0.1.jar:../lib/ibatis-common-2.jar:../lib/ibatis-dao-2.jar:../lib/ibatis-sqlmap-2.jar:../lib/jakarta-regexp-1.2.jar:../lib/javax.servlet.jar:../lib/jaxen-1.1-beta-6.jar:../lib/jaxrpc.jar:../lib/jdom.jar:../lib/jstl.jar:../lib/jta.jar:../lib/jtds-1.1.jar:../lib/junit.jar:../lib/log4j-1.2.8.jar:../lib/log4j-1.2.9.jar:../lib/mail.jar:../lib/nuxeo-common-1.0.jar:../lib/quartz-1.6.5.jar:../lib/saaj.jar:../lib/securityAPI_V14.jar:../lib/servlet-api.jar:../lib/signver.jar:../lib/standard.jar:../lib/Union.jar:../lib/wsdl4j-1.5.1.jar:../lib/xmlsec-1.4.3.jar:../lib/Yeepay_CARDproNew.jar:../lib/YeePay_HTMLcommon_V3.0.jar main.TestMain > /home/liuxingyu/nohup.out &

2011-08-27
创建链接命令  在/var/www的底下新建一个连接 sudo ln -s /usr/share/phpmyadmin



    SSH是一种以安全 、加密方式连接远程主机或服务器 的方法。SSH服务器接受从有SSH的客户机的连接,允许操作者象在本地一样地登录系统。你可以用SSH从远程运行shell和X程序。

    (1)安装SSH服务器
    加入Universe和Multiverse源后,用新立得安装ssh和openssh-server:

      网络 > ssh
      网络 > openssh-server

    (1)用SSH登录远程ubuntu主机

    假设远程Ubuntu主机安装了SSH服务器。远程Ubuntu主机的IP为:192.168.0.1
    我们在命令行输入一下命令来连接:

    ssh username@192.168.0.1

    (2)从远程ubuntu主机拷贝文件/文件夹到本地(scp)

    假设远程Ubuntu主机安装了SSH服务器。远程Ubuntu主机的IP为:192.168.0.1,远程文件夹位置为:/home/username/remotefile.txt    本地保存目录为:. (当前目录)
    在命令行输入一下命令:

    scp -r username@192.168.0.1:/home/username/remotefile.txt  .

    (3)从本地向远程ubuntu主机拷贝文件/文件夹(scp)

    假设远程Ubuntu主机安装了SSH服务器。远程Ubuntu主机的IP为:192.168.0.1,本地文件夹位置为:localfile.txt 远程Ubuntu保存目录:/home/username/

    在命令行输入一下命令:

    sc p -r localfile.txt username@192.168.0.1:/home/username/


2011-08-27
scp命令介绍

scp就是secure copy,是用来进行远程文件拷贝的.数据传输使用ssh1,并且和ssh1使用相同的认证方式,提供相同的安全保证.与rcp不同的是,scp会要求你输入密码如果需要的话.
最简单的应用如下(拷贝本地文件到远程服务器):

scp 本地用户名@IP地址:文件名1 远程用户名@IP地址:文件名2

[本地用户名@IP地址:]可以不输入,可能需要输入远程用户名所对应的密码.
可能有用的几个参数:
-v 和大多数linux命令中的-v意思一样,用来显示进度.可以用来查看连接,认证,或是配置错误.
-C 使能压缩选项.
-P 选择端口.注意-p已经被rcp使用.
-4 强行使用IPV4地址.
-6 强行使用IPV6地址.
scp中很多参数都和ssh1有关,需要的话在看.


PS: 命令行操作文件毕竟不是很直观,那能否通过窗口界面操作呢?答案是可以的。
装了Gnome或KDE界面后,点 位置-连接到服务器 ,在跳出窗口中:
服务类型 中选择SSH
服务器:ssh服务器的IP地址
然后可以直接点 连接。
再输入用户名,密码
会跳出远程ssh服务器的文件管理窗口。

自此就可以用惯常的复制,粘贴等来操作文件啦~


2011-09-13
在Linux中,如果要让进程在后台运行,一般情况下,我们在命令后面加上&即可,实际上,这样是将命令放入到一个作业队列中了:

$ ./test.sh &
[1] 17208

$ jobs -l
[1]+ 17208 Running                 ./test.sh &

对于已经在前台执行的命令,也可以重新放到后台执行,首先按ctrl+z暂停已经运行的进程,然后使用bg命令将停止的作业放到后台运行:

$ ./test.sh
[1]+  Stopped                 ./test.sh

$ bg %1
[1]+ ./test.sh &

$ jobs -l
[1]+ 22794 Running                 ./test.sh &

但是如上方到后台执行的进程,其父进程还是当前终端shell的进程,而一旦父进程退出,则会发送hangup信号给所有子进程,子进程收到hangup以后也会退出。如果我们要在退出shell的时候继续运行进程,则需要使用nohup忽略hangup信号,或者setsid将将父进程设为init进程(进程号为1)

$ echo $$
21734

$ nohup ./test.sh &
[1] 29016

$ ps -ef | grep test
515      29710 21734  0 11:47 pts/12   00:00:00 /bin/sh ./test.sh
515      29713 21734  0 11:47 pts/12   00:00:00 grep test

$ setsid ./test.sh &
[1] 409

$ ps -ef | grep test
515        410     1  0 11:49 ?        00:00:00 /bin/sh ./test.sh
515        413 21734  0 11:49 pts/12   00:00:00 grep test

上面的试验演示了使用nohup/setsid加上&使进程在后台运行,同时不受当前shell退出的影响。那么对于已经在后台运行的进程,该怎么办呢?可以使用disown命令:

$ ./test.sh &
[1] 2539

$ jobs -l
[1]+  2539 Running                 ./test.sh &

$ disown -h %1

$ ps -ef | grep test
515        410     1  0 11:49 ?        00:00:00 /bin/sh ./test.sh
515       2542 21734  0 11:52 pts/12   00:00:00 grep test

另外还有一种方法,即使将进程在一个subshell中执行,其实这和setsid异曲同工。方法很简单,将命令用括号() 括起来即可:

$ (./test.sh &)

$ ps -ef | grep test
515        410     1  0 11:49 ?        00:00:00 /bin/sh ./test.sh
515      12483 21734  0 11:59 pts/12   00:00:00 grep test

注:本文试验环境为Red Hat Enterprise Linux AS release 4 (Nahant Update 5),shell为/bin/bash,不同的OS和shell可能命令有些不一样。例如AIX的ksh,没有disown,但是可以使用nohup -p PID来获得disown同样的效果。

还有一种更加强大的方式是使用screen,首先创建一个断开模式的虚拟终端,然后用-r选项重新连接这个虚拟终端,在其中执行的任何命令,都能达到nohup的效果,这在有多个命令需要在后台连续执行的时候比较方便:

$ screen -dmS screen_test

$ screen -list
There is a screen on:
        27963.screen_test       (Detached)
1 Socket in /tmp/uscreens/S-jiangfeng.

$ screen -r screen_test


2011-09-30 9月的最后一天
  tail -n100000 //opt/tomcat-7071/webapps/api/logs/api.log  | grep 'exception' -A 20 -B 20
查询 exception 的前几行  后几行



2011-10-09 shell学习
Tomcat 自动监控脚本
本脚本监控Tomcat服务,当服务死掉后脚本自动重启服务。



1、将本脚本保存为/root/tcautorestart.sh,并给执行权限。

#!/bin/bash
if [[ -e /root/tcstatus.log ]];then
cp -f /dev/null /root/tcstatus.log
fi
/usr/local/bin/lynx -dump -connect_timeout=15000 -error_file=/root/tcstatus.log        \
http://downtheme.somode.com:8080/index.jsp         >/dev/null         ##index.jsp为用于测试的jsp页
cat /root/tcstatus.log | grep "STATUS=HTTP/1.1 200 OK" >/dev/null

if (( $? != 0 ));then
{
#shutdown tomcat
date >> /root/tcrestart.log
while true
do
/usr/local/tomcat/bin/shutdown.sh         >> /root/tcrestart.log
sleep 20
cp -f /dev/null /root/process.tc
ps -aux | awk '$0 ~ /java.*tomcat/{print $0}' > /root/process.tc
cat process.tc | grep "java.*tomcat" > /dev/null
if (( $? == 0 ));then
           continue
else
{
           echo "Tomcat shutdown success!" >> /root/tcrestart.log
           break
}
fi
done

#startup tomcat
while true
do
/usr/local/tomcat/bin/startup.sh         >> /root/tcrestart.log
sleep 5
cp -f /dev/null /root/process.tc
ps -aux | awk '$0 ~ /\/bin\/java/{print $0}' > /root/process.tc
cat process.tc |grep "/bin/java" > /dev/null
if (( $? == 0 ));then
{
           echo "Tomcat restartup success!" >> /root/tcrestart.log
           break
}
else
continue
fi
done
}
else
exit 0
fi

2、安装lynx
# tar -xzvf lynx2.8.5.tar.gz
# cd ynx2.8.5
# make
# make install         ##lynx默认安装到/usr/local/lynx下
# ln -s /usr/local/lynx/bin           ##注意自动化任务的path变量和bash的可能不同,一个能在bash中运行的很好的脚本不一定在cron中运行的很好,有些命令可能在cron中找不到,所有在脚本中尽量使用全路径。


3、将tomcat自启动脚本加到cron中
# crontab -e
#tomcat auto restart自动重启
*/5 * * * * /root/tcautorestart.sh > /dev/null 2>&1



---------------------------------------------------------------

参考:



得到网页的返回状态:
[root@toolsbook root]# lynx -dump -connect_timeout=15000 -error_file=/root/test1.log \
http://downtheme.somode.com:8080/index.jsp

          0                       ##显示浏览页的内容

[root@toolsbook root]# less /root/test1.log   ##查看网页的返回状态信息

      URL=http://downtheme.somode.com:8080/index.jspdf (GET)
STATUS=HTTP/1.1 404 /index.jspdf           ##网页不存在,返回404错误



      URL=http://downtheme.somode.com:8080/index.jsp (GET)
STATUS=HTTP/1.1 200 OK                  ##网页能正常访问



lynx参数:
     -dump :显示网页内容到标准输出并推出
     -connect_timeout :设置超时时间,单位(毫秒)
     -error_file :将网页的返回状态信息写进文件


2011-10-10 双十 辛亥革命
引用
JavaMelody
JavaMelody 能够监测Java或Java EE应用程序服务器,并以图表的方式显示:Java内存和Java CPU使用情况,用户Session数量,JDBC连接数,和http请求、sql请求、jsp页面与业务接口方法(EJB3、Spring、 Guice)的执行数量,平均执行时间,错误百分比等。图表可以按天,周,月,年或自定义时间段查看。

http://www.oschina.net/news/21874/perfmon4j-1-1-1-ga






2011-10-13 学习记录
公司的tomcat存在内存泄露的问题,偏偏程序员们也没时间去debug,当时我正好在研究shell脚本,就用shell写了如下内容:
首先,我不太懂tomcat,所以请java程序员写了一个web页面监控tomcat的状态,当tomcat空闲内存太少的时候,web页面的“LessOfMemory”字段就会消失,然后根据这个来判断是否应该重启tomcat。
正文如下:
#!/bin/bash
#Program
#       yong lai  jian shi  tomcat shi fou  si  diao .ru guo si le  jiu chong qi  ta  .
#History
#2009/1/5       Caoyameng       Version 1.0

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin:/usr/local/tomcat/bin
export PATH
#PATH里加入了tomcat的路径

test -e "status.jsp"  && rm -f  status.jsp;
#检测当前目录下是否有监控用的web文件存在,存在则删除。
wget  -b "http://127.0.0.1/main/status.jsp"
#下载这个页面,加-b的参数是为了让wget后台下载。
#之所以设置后台下载,是考虑到一种及其罕见的情况,如果cpu占用量100%或者端口阻塞,10分钟乃至1个小时都下载不下来这个页面,那整个监控脚本岂不是要卡在这里不动了?
sleep 3
#延时三秒,给wget下载页面的时间

tom=`cat status.jsp |grep LessOfMemory`
#设置一个变量为tom。
if  
          [ "$tom" == ""  ] ;then

sh /opt/tomcat/bin/shutdown.sh
#如果tom变量为空,则执行tomcatshutdown程序
date >>time.txt
#将shutdown的时间计入日志。
elif
                [ "$tom" != "" ] ;then
                exit 0
#如果tom不为空,则说明该web页面含有LessOfMemory字段,tomcat工作正常,退出shell脚本。
fi

sleep 3
#延时三秒,给tomcat自己结束自己的时间

tompid=`ps x | grep tomcat | grep -v grep|awk '{print $1}'`

#看一下tomcat进程是否还存在?如果存在,则将其PID号赋值给tompid变量

[ -z "$tompid" ] && kill -9  $tompid ;
#如果tompid不为空,则执行kill -9命令强行结束tomcat
Date >> time2.txt
#将系统时间写入第二个日志文件
sh  /opt/tomcat/bin/startup.sh
#重启tomcat。


2011-10-15
简介: 通过查看打开的文件,了解更多关于系统的信息。了解应用程序打开了哪些文件或者哪个应用程序打开了特定的文件,作为系统管理员,这将使得您能够作出更好的决策。例如,您不应该卸载具有打开文件的文件系统。使用 lsof,您可以检查打开的文件,并根据需要在卸载之前中止相应的进程。同样地,如果您发现了一个未知的文件,那么可以找出到底是哪个应用程序打开了这个文件。

在 UNIX® 环境中,文件无处不在,这便产生了一句格言:“任何事物都是文件”。通过文件不仅仅可以访问常规数据,通常还可以访问网络连接和硬件。在有些情况下,当您使用 ls 请求目录清单时,将出现相应的条目。在其他情况下,如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字,不存在相应的目录清单。但是在后台为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。

因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,所以能够查看这个列表将是很有帮助的。完成这项任务的实用程序称为 lsof,它对应于“list open files”(列出打开的文件)。几乎在每个 UNIX 版本中都有这个实用程序,但奇怪的是,大多数供应商并没有将其包含在操作系统的初始安装中。要获取更多关于 lsof 的信息,请参见参考资料部分。

lsof 简介

只需输入 lsof 就可以生成大量的信息,如清单 1 所示。因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。
清单 1. lsof 的示例输出

[img]http://dl.iteye.com/upload/attachment/570814/6d42ec42-141b-34cd-9827-e1939b27ae08.png[/img]

每行显示一个打开的文件,除非另外指定,否则将显示所有进程打开的所有文件。Command、PID 和 User 列分别表示进程的名称、进程标识符 (PID) 和所有者名称。Device、SIZE/OFF、Node 和 Name 列涉及到文件本身的信息,分别表示指定磁盘的名称、文件的大小、索引节点(文件在磁盘上的标识)和该文件的确切名称。根据 UNIX 版本的不同,可能将文件的大小报告为应用程序在文件中进行读取的当前位置(偏移量)。清单 1 来自一台可以报告该信息的 Sun Solaris 10 计算机,而 Linux® 没有这个功能。

FD 和 Type 列的含义最为模糊,它们提供了关于文件如何使用的更多信息。FD 列表示文件描述符,应用程序通过文件描述符识别该文件。Type 列提供了关于文件格式的更多描述。我们来具体研究一下文件描述符列,清单 1 中出现了三种不同的值。cwd 值表示应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改。txt 类型的文件是程序代码,如应用程序二进制文件本身或共享库,再比如本示例的列表中显示的 init 程序。最后,数值表示应用程序的文件描述符,这是打开该文件时返回的一个整数。在清单 1 输出的最后一行中,您可以看到用户正在使用 vi 编辑 /var/tmp/ExXDaO7d,其文件描述符为 3。u 表示该文件被打开并处于读取/写入模式,而不是只读 (r) 或只写 (w) 模式。有一点不是很重要但却很有帮助,初始打开每个应用程序时,都具有三个文件描述符,从 0 到 2,分别表示标准输入、输出和错误流。正因为如此,大多数应用程序所打开的文件的 FD 都是从 3 开始。

与 FD 列相比,Type 列则比较直观。根据具体操作系统的不同,您会发现将文件和目录称为 REG 和 DIR(在 Solaris 中,称为 VREG 和 VDIR)。其他可能的取值为 CHR 和 BLK,分别表示字符和块设备;或者 UNIX、FIFO 和 IPv4,分别表示 UNIX 域套接字、先进先出 (FIFO) 队列和网际协议 (IP) 套接字。

转到 /proc 目录

尽管与使用 lsof 没有什么直接的关系,但对 /proc 目录进行简要的介绍是有必要的。/proc 是一个目录,其中包含了反映内核和进程树的各种文件。这些文件和目录并不存在于磁盘中,因此当您对这些文件进行读取和写入时,实际上是在从操作系统本身获取相关信息。大多数与 lsof 相关的信息都存储于以进程的 PID 命名的目录中,所以 /proc/1234 中包含的是 PID 为 1234 的进程的信息。

在 /proc 目录的每个进程目录中存在着各种文件,它们可以使得应用程序简单地了解进程的内存空间、文件描述符列表、指向磁盘上的文件的符号链接和其他系统信息。lsof 实用程序使用该信息和其他关于内核内部状态的信息来产生其输出。稍后我将把 lsof 的输出与 /proc 目录中的信息联系起来。

常见用法

前面,我向您介绍了如何简单地运行不带任何参数的 lsof,以便显示关于每个进程所打开的文件的信息。本文余下的部分将重点关注如何使用 lsof 来显示所需的信息以及如何正确地对其进行解释。

查找应用程序打开的文件

lsof 常见的用法是查找应用程序打开的文件的名称和数目。您可能想尝试找出某个特定应用程序将日志数据记录到何处,或者正在跟踪某个问题。例如,UNIX 限制了进程能够打开文件的数目。通常这个数值很大,所以不会产生问题,并且在需要时,应用程序可以请求更大的值(直到某个上限)。如果您怀疑应用程序耗尽了文件描述符,那么可以使用 lsof 统计打开的文件数目,以进行验证。

要指定单个进程,可以使用 -p 参数,后面加上该进程的 PID。因为这样做不仅会返回该应用程序所打开的文件,还会返回共享库和代码,所以通常需要对输出进行筛选。要完成此任务,可以使用 -d 标志根据 FD 列进行筛选,使用 -a 标志表示两个参数都必须满足 (AND)。如果没有 -a 标志,缺省的情况是显示匹配任何一个参数 (OR) 的文件。清单 2 显示了 sendmail 进程打开的文件,并使用 txt 对这些文件进行筛选。

清单 2. 带有 PID 筛选器并进行 txt 文件描述符筛选的 lsof 输出

sh-3.00# lsof -a -p 605 -d ^txt
COMMAND  PID USER   FD   TYPE  DEVICE SIZE/OFF     NODE NAME
sendmail 605 root  cwd   VDIR  136,8     1024    23554 /var/spool/mqueue
sendmail 605 root    0r  VCHR  13,2            6815752 /devices/pseudo/mm@0:null
sendmail 605 root    1w  VCHR  13,2            6815752 /devices/pseudo/mm@0:null
sendmail 605 root    2w  VCHR  13,2            6815752 /devices/pseudo/mm@0:null
sendmail 605 root    3r  DOOR             0t0       58
		/var/run/name_service_door(door to nscd[81]) (FA:->0x30002b156c0)
sendmail 605 root    4w  VCHR  21,0           11010052 
						/devices/pseudo/log@0:conslog->LOG
sendmail 605 root    5u  IPv4 0x300010ea640      0t0      TCP *:smtp (LISTEN)
sendmail 605 root    6u  IPv6 0x3000431c180      0t0      TCP *:smtp (LISTEN)
sendmail 605 root    7u  IPv4 0x300046d39c0      0t0      TCP *:submission (LISTEN)
sendmail 605 root    8wW VREG         281,3       32  8778600 /var/run/sendmail.pid


清单 2 为 lsof 指定了三个参数。第一个是 -a,它表示当所有的参数都为真时,才显示这个文件。第二个参数是 -p 605,它限制仅输出 PID 为 605 的进程,可以通过 ps 命令获取这个信息。最后一个参数 -d ^txt,它表示筛选出其中 txt 类型的记录(脱字符号 [^] 表示排除)。

清单 2 的输出提供了关于进程行为的信息。如 cwd 行所示,该应用程序的工作目录为 /var/spool/mqueue。文件描述符 0、1 和 2 分配给了 /dev/null(Solaris 大量使用符号链接,所以这里显示了相应的伪设备)。FD 3 是一个 Solaris 门(高速远程过程调用 (RPC) 接口),以只读模式打开。FD 4 中的内容比较有趣,因为它是一个字符设备的只读句柄,实质上是 /dev/log。从这个文件中,您可以收集该应用程序向 UNIX syslog 守护进程进行的记录,所以 /etc/syslog.conf 规定了日志文件的位置。

作为一个网络应用程序,sendmail 对网络端口进行监听。文件描述符 5、6 和 7 可以告诉您,该应用程序正以 IPv4 和 IPv6 模式监听简单邮件传输协议 (SMTP) 端口,并以 IPv4 模式监听提交端口。最后一个文件描述符是只写的,并且指向 /var/run/sendmail.pid。FD 列中的大写 W 表示该应用程序具有对整个文件的写锁。该文件用于确保每次只能打开一个应用程序实例。

查找打开某个文件的应用程序

在其他情况下,您有一个文件或目录,并且需要知道哪个应用程序控制了该文件(打开了该文件)。清单 2 显示了由 sendmail 进程打开了 /var/run/sendmail.pid。如果您不知道这个信息,那么在给定文件名的情况下,lsof 可以提供该信息。清单 3 显示了相应的输出。

清单 3. 要求 lsof 显示关于某个文件的信息

bash-3.00# lsof /var/run/sendmail.pid
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
sendmail 605 root    8wW VREG  281,3       32 8778600 /var/run/sendmail.pid


正如输出所示,进程 sendmail(PID 为 605)控制了文件 /var/run/sendmail.pid,并且通过排它锁打开该文件以便进行写入。如果出于某种原因,您需要删除这个文件,那么正确的做法是中止该进程,而不是直接删除这个文件。否则,这个守护进程下次可能无法正常启动,或者可能稍后会启动另一个实例,从而导致争用。

有时您只知道在文件系统的某处打开了文件。在卸载文件系统时,如果该文件系统中有任何打开的文件,那么操作将会失败。通过指定装入点的名称,您可以使用 lsof 显示一个文件系统中所有打开的文件。清单 4 显示了如何尝试卸载 /export/home,然后使用 lsof 找出谁在使用该文件系统。

清单 4. 使用 lsof 找出谁在使用文件系统

bash-3.00# umount /export/home
umount: /export/home busy
bash-3.00# lsof /export/home
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
bash    1943 root  cwd   VDIR  136,7     1024    4 /export/home/sean
bash    2970 sean  cwd   VDIR  136,7     1024    4 /export/home/sean
ct      3030 sean  cwd   VDIR  136,7     1024    4 /export/home/sean
ct      3030 sean    1w  VREG  136,7        0   25 /export/home/sean/output


在这个示例中,用户 sean 正在其 home 目录中进行一些操作。有两个 bash(一种 Shell)实例正在运行,并且当前目录设置为 sean 的 home 目录。还有一个名为 ct 的应用程序正运行于相同的目录,并且其标准输出(文件描述符 1)重定向到一个名为 output 的文件。要成功地卸载 /export/home,应该在通知用户以确保情况正常之后,中止这些进程。

这个示例说明了应用程序的当前工作目录非常重要,因为它仍保持着文件资源,并且可以防止文件系统被卸载。这就是为什么大部分守护进程(后台进程)将它们的目录更改为根目录、或服务特定的目录(如 sendmail 示例中的 /var/spool/mqueue)的原因,以避免该守护进程阻止卸载不相关的文件系统。如果 sendmail 从 /export/home/sean 目录启动,并且没有将其目录更改为 /var/spool/mqueue,那么在卸载 /export/home 前必须中止它。

如果您对非装入点目录中打开的文件感兴趣,那么必须通过 +d 或 +D 指定该目录的名称,具体使用其中的哪一个标志取决于您需要递归到子目录(+D)或者不需要递归到子目录(+d)。例如,要查看 /export/home/sean 中所有打开的文件,可以使用 lsof +D /export/home/sean。在前面的示例中,相关的目录是一个装入点,而这里与前面的示例存在细微的差别,并且限制了 lsof 和内核之间的交互。这还会引起潜在的问题,即 lsof /export/home 与 lsof /export/home/(请注意尾部的斜杠)有所区别。第一种方式可以正常工作,因为它指向了装入点。第二种方式不会生成任何输出,因为它指向了目录。如果您在 Shell 中使用 Tab 键自动完成命令,那么可能碰到这个问题,其中会帮助您添加结尾的斜杠。在这种情况下,您可以删除这个斜杠或者使用 +D 指定目录。前者是首选的方法,因为与指定任意的目录相比,其执行速度更快。

不常见的用法

在前面的部分中,我们研究了 lsof 的基本用法,即显示打开的文件和控制它们的进程之间的关系。当您想对系统进行一些烦琐的操作,而又不希望破坏别人重要的文档时,这种方法很有帮助。您还可以使用相同的方法执行一些高难度的 UNIX 操作。

恢复删除的文件

当 UNIX 计算机受到入侵时,常见的情况是日志文件被删除,以掩盖攻击者的踪迹。管理错误也可能导致意外删除重要的文件,比如在清理旧日志时,意外地删除了数据库的活动事务日志。有时可以恢复这些文件,并且 lsof 可以为您提供帮助。

当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。这意味着,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录条目。

前面曾在转到 /proc 目录部分中说过,通过在适当的目录中进行查找,您可以访问进程的文件描述符。在随后的内容中,您看到了 lsof 可以显示进程的文件描述符和相关的文件名。您能明白我的意思吗?

但愿它真的这么简单!当您向 lsof 传递文件名时,比如在 lsof /file/I/deleted 中,它首先使用 stat() 系统调用获得有关该文件的信息,不幸的是,这个文件已经被删除。在不同的操作系统中,lsof 可能可以从核心内存中捕获该文件的名称。清单 5 显示了一个 Linux 系统,其中意外地删除了 Apache 日志,我正使用 grep 工具查找是否有人打开了该文件。

清单 5. 在 Linux 中使用 lsof 查找删除的文件

# lsof | grep error_log
httpd      2452     root    2w      REG       33,2      499    3090660
					/var/log/httpd/error_log (deleted)
httpd      2452     root    7w      REG       33,2      499    3090660
					/var/log/httpd/error_log (deleted)
... more httpd processes ...


在这个示例中,您可以看到 PID 2452 打开文件的文件描述符为 2(标准错误)和 7。因此,可以在 /proc/2452/fd/7 中查看相应的信息,如清单 6 所示。

清单 6. 通过 /proc 查找删除的文件

# cat /proc/2452/fd/7
[Sun Apr 30 04:02:48 2006] [notice] Digest: generating secret for digest authentication
[Sun Apr 30 04:02:48 2006] [notice] Digest: done
[Sun Apr 30 04:02:48 2006] [notice] LDAP: Built with OpenLDAP LDAP SDK


Linux 的优点在于,它保存了文件的名称,甚至可以告诉我们它已经被删除。在遭到破坏的系统中查找相关内容时,这是非常有用的内容,因为攻击者通常会删除日志以隐藏他们的踪迹。Solaris 并不提供这些信息。然而,我们知道 httpd 守护进程使用了 error_log 文件,所以可以使用 ps 命令找到这个 PID,然后可以查看这个守护进程打开的所有文件。

清单 7. 在 Solaris 中查找删除的文件

# lsof -a -p 8663 -d ^txt
COMMAND  PID   USER   FD   TYPE        DEVICE SIZE/OFF    NODE NAME
httpd   8663 nobody  cwd   VDIR         136,8     1024       2 /
httpd   8663 nobody    0r  VCHR          13,2          6815752 /devices/pseudo/mm@0:null
httpd   8663 nobody    1w  VCHR          13,2          6815752 /devices/pseudo/mm@0:null
httpd   8663 nobody    2w  VREG         136,8      185  145465 / (/dev/dsk/c0t0d0s0)
httpd   8663 nobody    4r  DOOR                    0t0      58 /var/run/name_service_door
						(door to nscd[81]) (FA:->0x30002b156c0)
httpd   8663 nobody   15w  VREG         136,8      185  145465 / (/dev/dsk/c0t0d0s0)
httpd   8663 nobody   16u  IPv4 0x300046d27c0      0t0     TCP *:80 (LISTEN)
httpd   8663 nobody   17w  VREG         136,8        0  145466 
                                                          /var/apache/logs/access_log
httpd   8663 nobody   18w  VREG         281,3        0 9518013 /var/run (swap)


我使用 -a 和 -d 参数对输出进行筛选,以排除代码程序段,因为我知道需要查找的是哪些文件。Name 列显示出,其中的两个文件(FD 2 和 15)使用磁盘名代替了文件名,并且它们的类型为 VREG(常规文件)。在 Solaris 中,删除的文件将显示文件所在的磁盘的名称。通过这个线索,就可以知道该 FD 指向一个删除的文件。实际上,查看 /proc/8663/fd/15 就可以得到所要查找的数据。

如果可以通过文件描述符查看相应的数据,那么您就可以使用 I/O 重定向将其复制到文件中,如 cat /proc/8663/fd/15 > /tmp/error_log 。此时,您可以中止该守护进程(这将删除 FD,从而删除相应的文件),将这个临时文件复制到所需的位置,然后重新启动该守护进程。

对于许多应用程序,尤其是日志文件和数据库,这种恢复删除文件的方法非常有用。正如您所看到的,有些操作系统(以及不同版本的 lsof)比其他的系统更容易查找相应的数据。

查找网络连接

网络连接也是文件,这意味着可以使用 lsof 获得关于它们的信息。您曾在清单 2 中看到过这样的示例。该示例假设您已经知道 PID,但是有时候并非如此。如果您只知道相应的端口,那么可以使用 -i 参数利用套接字信息进行搜索。清单 8 显示了对 TCP 端口 25 的搜索。

清单 8. 查找监听端口 25 的进程

# lsof -i :25
COMMAND  PID USER   FD   TYPE        DEVICE SIZE/OFF NODE NAME
sendmail 605 root    5u  IPv4 0x300010ea640      0t0  TCP *:smtp (LISTEN)
sendmail 605 root    6u  IPv6 0x3000431c180      0t0  TCP *:smtp (LISTEN)


需要以 protocol:@ip:port 的形式向 lsof 实用程序传递相关信息,其中的 protocol 为 TCP 或 UDP(可以使用 4 或 6 作为前缀,表示 IP 的版本),IP 为可解析的名称或 IP 地址,而 port 为数字或表示该服务的名称(来自 /etc/services)。需要一个或多个元素(端口、IP、协议)。在清单 8 中,:25 表示端口 25。输出显示,进程 605 正在使用 IPv6 和 IPv4 监听端口 25。如果您对 IPv4 不感兴趣,那么可以将筛选器改为 6:25,以表示监听端口 25 的 IPv6 套接字,或者直接使用 6 表示所有的 IPv6 连接。

除了显示出这些守护进程正在监听的对象,lsof 还可以发现发生的连接,同样是使用 -i 参数。清单 9 显示了搜索与 192.168.1.10 之间的所有连接。

清单 9. 搜索活动的连接

# lsof -i @192.168.1.10
COMMAND  PID USER   FD   TYPE        DEVICE  SIZE/OFF NODE NAME
sshd    1934 root    6u  IPv6 0x300046d21c0 0t1303608  TCP sun:ssh->linux:40379
							 (ESTABLISHED)
sshd    1937 root    4u  IPv6 0x300046d21c0 0t1303608  TCP sun:ssh->linux:40379
							 (ESTABLISHED)


在这个示例中,sun 和 linux 之间有两个 IPv6 连接。对其进行更仔细的研究可以看出,这些连接来自于两个不同的进程,但它们却是相同的,这是因为两台主机是相同的,并且端口也是相同的(ssh 和 40379)。这是由于进入主进程的连接分叉出一个处理程序,并将该套接字传递给它。您还可以看到,名为 sun 的计算机正在使用端口 22 (ssh),而 linux 具有端口 40379。这表示,sun 是该连接的接收者,因为它关联于该服务的已知端口。40379 是源或临时端口,并且仅对这个连接有意义。

因为,至少在 UNIX 中,套接字是另一类文件,所以 lsof 可以获得关于这些连接的详细信息,并找出谁对它们负责。

结束语

UNIX 大量使用了文件。作为系统管理员,lsof 允许您对核心内存进行查看,以找出系统当前如何使用这些文件。lsof 最简单的用法可以告诉您哪些进程打开了哪些文件,以及哪些文件由哪些进程打开。在收集关于应用程序工作情况的信息时,或在进行某些可能损坏数据的操作前确保文件未被使用时,这一点特别重要lsof 更高级的用法可以帮助您查找删除的文件,并获得关于网络连接的信息。这是一个功能强大的工具,它几乎可以用于任何地方。




2011-10-31 学习心得
VI中的多行删除与复制
2011-01-11 14:40
VI中的多行删除与复制
2010-11-24 16:19:41

VI中的多行删除与复制
法一:
单行删除,:1(待删除行)d
多行删除 ,:1,10d
法二:
光标所在行,dd
光标所在行以下的N行,Ndd
方法1:
光标放到第6行,
输入:2yy
光标放到第9行,
输入:p
此方法适合复制少量行文本的情况,复制第6行(包括)下面的2行数据,放到第9行下面。
方法2:
命令行模式下输入
6,9 co 12
复制第6行到第9行之间的内容到第12行后面。
方法3:
有时候不想费劲看多少行或复制大量行时,可以使用标签来替代
光标移到起始行,输入ma
光标移到结束行,输入mb
光标移到粘贴行,输入mc
然后 :'a,'b co 'c 把 co 改成 m 就成剪切了
要删除多行的话,可以用 :5, 9 de

VIM常用命令
常用命令

1) 光标命令
k,j,h,l---上下左右光标移动命令,虽然可以在Linux中使用键盘右边的四个光标键, 但是记住这四个命令还有非常有用的,也就是右手在键盘上放置的位置部分
nG ----n为行数,该命令立即使光标跳到指定行。
Ctrl+G-----光标所在位置的行数和列数报告
w,b------使光标向前或向后跳过一个单词
2) 编辑命令
i,a,r -------在光标的前,后,上方插入字符命令(i=insert,a=append,r=replace) 
cw,dw------ 改变(置换)/删除光标所在处的单词的命令 (c=change,d=delete) 
x,d$,dd -----删除一个字符,光标所在处到行尾的所有字符,和整行的命令
3) 查找命令 
/string, ?string-----从光标所在处向后/向前查找相应的字符串的命令
4)拷贝复制命令 
yy,p -----拷贝一行到剪贴板/取出剪贴板中内容的命令

常见问题及应用技巧
1) 在一个新文件中读/etc/passwd中的内容,取出用户名部分 
vi file 
:r /etc/passwd 在打开的文件file中光标所在处读入/etc/passwd 
:%s/:.*//g 删除/etc/passwd中用户名后面的从冒号开始直到行尾的所有部分 
:3r /etc/passwd 这是在指定的行号后面读入文件内容
另外一种方法删掉文件中所有的空行及以#开始的注释行 
#cat squid.conf.default | grep -v '^$' | grep -v '^#' 

2) 在打开一个文件编辑后才知道登录的用户对该文件没有写权,不能存盘 
vi file 
:w /tmp/1 既然没法存盘,不想放弃所做的所有修改,先临时存到/tmp/1 
:20,59w /tmp/1 或者仅仅把第20到59行之间的内容存盘成文件/tmp/1
3) 用VI编辑一个文件,但需要删除大段大段的内容 
vi file 
Ctrl+G 把光标移到需要删除的行的处按ctrl+G显示行号,再到结尾处再按Ctrl+G. 
:23,1045d 假定两次行号为23和1045,则把这几间的内容全删除 

也可以在开始和结束两行中用ma,mb命令标记后用:'a,'bd删除.
4) 在整个文件或某几行中在行首或行尾加一些字符串 
vi file 
:3,$s/^/some string / 在文件的第一行至最后一行的行首前插入some string 
:%s/$/ some string/g 在整个文件每一行的行尾添加 some string 

:%s/string1/string2/g 在整个文件中替换string1成string2 
:3,7s/string1/string2/ 仅替换文件中的第三到七行中的string1成string2 

Note: s为substitute,%表示所有行,g表示global 

5) 同时编辑两个文件,在两个文件中拷贝剪贴文本 
vi file1 file2 
yy 同时打开两个文件,在文件1的光标所在处拷贝所在行 
:n 切换到文件2 (n=next) 
p 在文件2的光标所在处粘贴所拷贝的行 
:N 切换回文件1
6) 替换文件中的路径 

:%s#/usr/bin#/bin#g 把文件中所有路径/usr/bin换成/bin 
或者用 
:%s//usr/bin//bin/g 在'/'前用符号指出'/'是真的单个字符'/'
7) 用 vi 多行注释
如果要给多行程序作注释,一个笨办法就是 插入 # ,然后用 j 跳到下一行用 . 命令,重复上个命令。如果要注释几百行,这样的方法恐怕太愚蠢了。一个聪明的办法是:
:.,+499 s/^/#/g



  • 大小: 3.7 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics