Skip to main content

LINUX 命令(2) cut

今天我要介绍cut命令,一个非常简单也好用的命令,可以迅速地从每行找到你想要的文本

语法:

[bash]
cut [-bn] [file] 或 cut [-c] [file] 或 cut [-df] [file]
[/bash]

1.按字节来选择文本,命令: cut -b

[bash]
[caveup0@iZ23myrure3Z ~]$ who |cut -b 3
v
[caveup0@iZ23myrure3Z ~]$ who |cut -b 3-5
veu
[caveup0@iZ23myrure3Z ~]$ who |cut -b 1-5
caveu
[caveup0@iZ23myrure3Z ~]$
[/bash]

2.按字符来选择文本,命令: cut -c

[bash]
[caveup0@iZ23myrure3Z ~]$ who |cut -c 2-3
av
[caveup0@iZ23myrure3Z ~]$
[/bash]

看了上边两个列子,好像-b和-c差不多,其实两个是不一样的。一个是用字节来分割,一个是用字符来分割。
一般ansi编码字符和字节是一样的,但是UTF8或者其他的编码,字节和字符是不相等的,大家可以试试中文


[bash]
[caveup0@iZ23myrure3Z ~]$ cat a.txt
我是一个人
[caveup0@iZ23myrure3Z ~]$ cut -b 2 a.txt

[caveup0@iZ23myrure3Z ~]$ cut -c 2 a.txt

[caveup0@iZ23myrure3Z ~]$
[/bash]

3.按给定的分隔符来选择文本,命令: cut -d <分隔符> -f
用-d来设置间隔符,然后用-f来设置我要取的是字段。
注意:cut只擅长处理“以一个字符间隔”的文本内容,如果想以多个字符来分割,可以结合sed来搭配使用。

[bash]
[caveup0@iZ23myrure3Z ~]$ cat /etc/passwd |head -n 4 |cut -d ':' -f1
root
bin
daemon
adm
[caveup0@iZ23myrure3Z ~]$
[/bash]

欢迎大家有更好的见解和使用心得!

Linux 命令(1) rm

一直在用linux,对linux运维和配置也比较熟悉,所以计划结合自己的经验,写一些linux的文章。欢迎大家留言和拍砖!!

熟悉Linux的朋友们,一定经常用rm这个command。而经常有一些朋友喜欢直接加上参数-rf。所以当误删除的时候,一定非常怀念window系统,因为它有个回收站。这样可以很方便的找出来。但是在linux下如何避免这样的问题发生呢。

自己简单地总结了2个方法:

1. alias rm .不能直接call rm command,需要写完整的路径来调用rm command。比如:

alias rm=’ echo call /bin/rm -i’

这样可以简单的提醒下。

2. 改变默认的rm 行为。

可以通过自己写一个bash script。让rm调用这个bash script。而这个bash script可以实现如何提醒或者不删除,而把要删除的文件移动到另外的地方或者目录。

自己简单实现了一个可以move和double check 的rm。具体代码如下。希望拍砖啊。 #!/bin/bash

[bash]
promt_usage(){
cuser=`who am i |awk '{print $1}'`
echo "****************************************"
echo "* *"
echo "* \\\\---$cuser---//// *"
echo "* Delete: Please Be Careful *"
echo "* *"
echo "****************************************"
}
promt_mv(){
echo "**************************************"
echo "* *"
echo "* Current status:pre-moving *"
echo "* move files:$@ *"
echo "* *"
echo "**************************************"
}
drm(){
promt_usage
BACK_UP=no
PROMT=no
RECURSIVE=no
FORCE=no
FILE=""
while getopts birf opt
do
case $opt in
b) BACK_UP=yes
;;
r) RECURSIVE=yes
;;
f) FORCE=yes
;;
i) PROMT=yes
;;
'?')
;;
esac
done
#the destination file
while [ "$#" != 0 ]
do
shift
if [[ $@ != -* ]]
then
break
fi
done
FILE="$@"
#double check rm
if [ "x$BACK_UP" = "xyes" ]
then
promt_mv $FILE
mv $FILE /tmp
else
echo "Are you sure to delete these files(y/n)?"
read ack
echo "Are you sure to delete these fiiles(y/n),really?"
read ack2
#double check
if [[ "x$ack" == "x$ack2" ]] && [[ "x$ack" == "xy" ]]
then
/bin/rm "$@"
else
echo "Please check your input!"
fi
fi

}
drm "$@"
[/bash]


[bash]
alias rm='bash /home/xliang/.drm.sh -i'
[/bash]

这样可以简单地避免一些,但是还是需要自己的细心才能解决根本问题。每次调用rm的时候,一定确定自己对rm做的操作很有信心,否则后悔都来不及!

Ant 项目构建(2)

上一篇介绍了一下Ant的产生和特点,在最后给大家看看了build.xml。其实Ant的核心就是build.xm。如何编写适合自己工程的build.xml是最重要的。

  • build.properties

tomcat.home=F:\\Java\\Tomcat 5.5
webapps.home=F:\\Java\\Tomcat 5.5\\webapps

build.properties文件是存储一些公共变量的,比如你机子上tomcat的绝对路径。
其实也用到了面向对象的原理,如果你的环境变了,只需要更改build.properties文件就可以了。而不用去更改build.xm里的相关属性。build.properties也可以加上你想加的东西,比如公共的jar文件。。

  • build.xml

project代表一个工程,有4个常见属性:
(1). default 表示默认的运行目标,是必须的
(2). basedir 表示工程的基准目录,”.”表示和build.xml所在的目录。
(3). name 表示工程的名字
(4).description 对工程的描述,可写可不写,写上更清楚对以后的debug

  • build.xml的target

每个build.xml只有个project,但是可以有多个target(目标).比如:

[xml]

<target name="compile" depends ="prepare">
<javac srcdir="${src.home}" destdir="${classes.home}" debug="yes">
<classpath refid = "compile.classpath"/>
</javac>
</target>

[/xml]

介绍完target,大家就会对build.xml有了一个更清楚的认识,更深地清楚了build.xml的框架.更详细的,可以去访问apache ant主页。

apache ant

ant手册

欢迎大家拍砖!

Ant 项目构建(1)

为了条理地介绍Ant,下面我分几部分来介绍Ant:

1.什么是Ant

Ant是一种基于java的build工具,理论上来说,有点类似与(liunx)种的make,但是修复了make的缺陷,使build更加好用,更加方便。
这里有必要介绍一下为什么会产生Ant这个工具?
既然已经有了make,gnumake,nmake,jam和其他的构建工具,为什么还有开发另外一个呢?这时因为那些工具都具有局限性,Ant的原作者(JamesDuncanDavidson)在开发跨平台软件时,并不能使用其中一个完成所有的任务,这就好像,在英语不是通用语言之前,你去那里,必须搞个翻译似的,降低了开发小绿绿,也急不利于大型软件开发的维护。已有的构建工具都是基于特定平台和听顶语言的,受到操作系统的限制太大。
更重要的是,makefile有天生的痼疾,任何在liunx下调试过C程序的都碰到过可恶的Tab问题。也许一个多余的空格,就会导致一个build不能运行?你说?这方便吗?
而Ant则在所有构建工具的基于上,开发出来了跨平台,跨语言的构建工具,已成为最优秀的构建工具,几乎所有的IDE都自带了Ant工具。

2. Ant的特点

  • 跨平台性,ant是基于java的,而java跨平台的性能是与庸置疑的,ant配置文件是基于XML的,而XML是格式最规范的数据格式。因而Ant跨平台的性能也不言而喻
  • 功能强大,从项目的编译,打包,发布,测试到版本的控制,Ant无所不能
  • 灵活方便
  • 可重用性高, Ant的配置文件Build.xml以一个project为开头,以不同的target为任务模块,彼此之间相互独立,但是模块之间又可以相互联系,因而耦合性和内聚性达到了完美的统一
  • 开源软件
3.Ant的配置
上边简单介绍了Ant,相信没有用过的,一定很想试试,那我告诉你,如果你试过了,一定会喜欢上她的,
下面介绍一下怎么配置
和JDK配置一下,先到apache主页上下载ant最新版本,具体网址可以google/baidu。
配置大家也可以搜索,很easy的。
4Ant如何运行呢?
和javac,java一样,直接在cmd下,输入ant就可以了,但是前提必须在该目录中有build.xml。
所以build.xml是最重要的,build.xml里详细地配置了ant如何运行和执行那些功能。
下面是我写的一个build.xml

[xml]
<project name="encrypt" default="help" basedir=".">
<!–
All properties should be defined in this section.Any host-specific properties should be defined
in the build.properties file.
In this app,the following properties are defined in build.properties:
1.tomcat.home === the home directory of your Tomcat installation
2.webapps.home === the place to copy the war file to deploy it.
–>
<property file="build.properties"/>
<property name="app.home" value="."/>
<property name="app.name" value="application"/>
<property name="javadoc.pkg.top" value="encrypt"/>

<property name="src.home" value="${app.home}/src"/>
<property name="lib.home" value="${app.home}/lib"/>
<property name="classes.home" value="${app.home}/classes"/>
<property name="deploy.home" value="${app.home}/deploy"/>
<property name="doc.home" value="${app.home}/doc"/>
<property name="web.home" value="${app.home}/WebRoot"/>

<property name="build.home" value="${app.home}/build"/>
<property name="build.classes" value="${build.home}/WEB-INF/classes"/>
<property name="build.lib" value="${build.home}/WEB-INF/lib"/>

<!–Compilatin Classpath–>
<!– This section creates the classpath for compilation–>
<path id="compile.classpath">
<!–The lib files for this application–>
<fileset dir="${lib.home}">
<include name="*.jar"/>
<include name="*.zip"/>
</fileset>

<!–All files/jars that Tomcat makes available–>
<fileset dir="${tomcat.home}/common/lib">
<include name="*.jar"/>
</fileset>
<pathelement location="${tomcat.home}/common/classes"/>
</path>
<!–==========help targe==========–>
<!–This is the default ant target executed if no target is specified.
This helps avoid user just typed ‘ant’ and runing a default target
that may not do what they are anticipating
–>
<target name="help">
<echo message="Please specify a target![usage:ant <targetname>]"/>
<echo message="Here is a list of possible targets:"/>
<echo message=" clean-all …..Delete all dir,all.class and war files"/>
<echo message=" prepare …..Create directories if required"/>
<echo message=" compile …..Compiles source file"/>
<echo message=" build …..Build war file form.class and other files"/>
<echo message=" deploy …..Copy war files to the webapps directory"/>
<echo message=" javadoc …..Generates javadoc for this application"/>
</target>

<!–=========="clean-all" target==========–>
<target name="clean">
<delete dir="${build.home}"/>
<delete dir="${classes.home}"/>
<delete dir="${deploy.home}"/>

<!–cannot delete directory if tomcat is runing–>
<delete dir="${webapps.home}/${app.home}" failonerror="false"/>
<delete dir="${webapps.home}/S{app.name}.war"/>

<!–delete javadoc–>
<delete dir="${doc.home}"/>
</target>
<!—==========="prepare" target===========–>
<!– This target is executed prior to any of the later targets
to make sure the directories exist.It only creates them if
they need to be created…
Other,similar,preparation steps can be placed here
–>
<target name="prepare">
<echo message="Tomcat Home =${tomcat.home}"/>
<echo message = "webapps Home = ${webapps.home}"/>

<mkdir dir="${classes.home}"/>
<mkdir dir="${deploy.home}"/>
<mkdir dir="${doc.home}"/>
<mkdir dir="${doc.home}/api"/>

<mkdir dir="${build.home}"/>
<mkdir dir="${build.home}/WEB-INF"/>
<mkdir dir="${build.home}/WEB-INF/classes"/>
<mkdir dir="${build.home}/WEB-INF/lib"/>
</target>

<!–=========="compile" target==========–>
<!–This only compiles java files that are newer
than their corresponing.class files
–>
<target name="compile" depends ="prepare">
<javac srcdir="${src.home}" destdir="${classes.home}" debug="yes">
<classpath refid = "compile.classpath"/>
</javac>
</target>

<!–============"build" target=============–>
<!–This target builds the war file for the application by
first building the directory structure of the application
in ${build.home} and then creating the war file using the
ant <war> task
–>
<target name="build" depends="compile">
<!–Copy all the wabapp content(jsp’s,html,tld’s,xml,etc…–>
<copy todir="${build.home}">
<fileset dir="${web.home}"/>
</copy>

<!–copy all java class files–>
<copy todir="${build.home}/WEB-INF/classes">
<fileset dir="${classes.home}"/>
</copy>

<!–Now, copy all the properties files,etc that go on the classpath–>
<copy todir="${build.home}/WEB-INF/classes">
<fileset dir="${src.home}">
<include name="**/*.properties"/>
<include name="**/*.prop"/>
</fileset>
</copy>

<!–Now,copy all the jar files we need–>
<copy todir="${build.home}/WEB-INF/lib">
<fileset dir="${lib.home}"/>
</copy>

<!–create the <war> file–>
<jar jarfile="${deploy.home}/${app.name}.war" basedir="${build.home}"/>
</target>
<!–================"deploy" target============–>
<!– This target simply copies the war file from the deploy
directory into the Tomcat webapps directory.
–>
<target name="deploy" depends="build">

<!–copy the contents of the build directory–>
<copy todir="${webapps.home}" file="${deploy.home}/${app.name}.war"/>
</target>

<!–================="doc" target=========–>
<!– This task create javadoc.It is dependent upon only the ‘compile’ target
it is not executed in a normal build.As a result,the target needs to
be run on its own.
–>
<target name="javadoc" depends="compile">
<javadoc sourcepath="${src.home}" destdir="${doc.home}/api"
packagenames="${javadoc.pkg.top}.*"/>
</target>
</project>
[/xml]

下边是build.properties的文件内容:
tomcat.home=F:\\Java\\Tomcat 5.5
webapps.home=F:\\Java\\Tomcat 5.5\\webapps
大家如果仔细看了build.xml,会发现build.xml只有个project,下边会有几个target。确实是这样,每个build.xml只有一个project,属性default必须的。而每个target执行不同的功能,具体的语法,大家可以看apace ant的介绍。

Jsch 深入浅出(二)

在上面一个帖子里就简单介绍了如何基于jsch实现ssh.

下面就简单介绍一下如何实现FTP的功能通过JSCH.

[java]

public class JftpHandler extends JschHandler {
private static final Logger log = LoggerFactory
.getLogger(JftpHandler.class);

private ChannelSftp sftp = null;

public JftpHandler(String username, String host, int port, String identity) {
super(username, host, port, identity);
}

public JftpHandler(String username, String host, int port, UserInfo userInfo) {
super(username, host, port, userInfo);
}

@Override
public void init() throws JSchException {
super.init();
sftp = (ChannelSftp) session.openChannel(SFTP_PROTOCAL);//sftp
sftp.connect();
log.info("Jftp connection success.");
}

@Override
public void destory() {
if (sftp != null) {
sftp.quit();
sftp.disconnect();
}
super.destory();

log.info("Jftp destory success.");
}

public void cd(String path) throws SftpException {
sftp.cd(path);
}

public void lcd(String path) throws SftpException {
sftp.lcd(path);
}

public String lpwd() {
return sftp.lpwd();
}

public String pwd() throws SftpException {
return sftp.pwd();
}

public void mkdir(String path) throws SftpException {
sftp.mkdir(path);
}

public void rm(String path) throws SftpException {
sftp.rm(path);
}

public void quit() {
sftp.quit();
}

public void rmdir(String path) throws SftpException {
sftp.rmdir(path);
}

public void exit() {
sftp.exit();
}

public void put(String src, String dst, int mode) throws SftpException {
sftp.put(src, dst, mode);
}

public void put(String src, String dst) throws SftpException {
put(src, dst, 0);
}

public void put(String dst) throws SftpException {
put(dst, ".");
}

public void get(String src, String dst) throws SftpException {
sftp.get(src, dst);
}

public void get(String src) throws SftpException {
get(src, ".");
}

/**
* Changes the permissions of one or several remote files.
*
* @param permissions
* @param path
* @throws SftpException
*/
public void chmod(int permissions, String path) throws SftpException {
sftp.chmod(permissions, path);
}

/**
* @returns the protocol version number supported by this client
*/
public String version() {
return sftp.version();
}

}

[/java]

上面的代码只是对JSCH的简单包装,也是对JSCH的抛砖引玉。希望对大家有点用处。。。