Entries Tagged as 'Shell'

在shell程序中用vim删除掉文件的最后一行

怎样用shell脚本删除掉文件的最后一行
网上大家多有讨论
方法也多多
比如用sed
用tail
用head
等等等等
但貌似都需要先把输出定向到一个临时文件
然后再删除原有文件
最后再把临时文件mv成原文件
后来找到一种方法
利用vim和重定向
直接在shell里实现
代码是这样的:

vim xxxx.txt 2>/dev/null < G
dd
:x!
END

如此而已
呵呵

关于命令tail的参数-F的使用

作为系统管理员
tail这个命令应该是很熟悉的
经常会用到用”-f”的参数来监控log文件(看着log一屏屏的翻,比较有成就感:)
好像在实时log分析的程序里
大家的思路大多也是用tail -f某个log文件
然后再用管道传给程序处理
但这样有一个问题
就是当系统logrotate这个log文件的时候
系统会重建这个log文件
在这个时候
如果监控这个log文件用的是命令”tail -f“的话
就会接不到任何新的内容
一般的做法是在这个log文件logrotate之前把监控的脚本程序(包含tail -f)都kill掉
在logrotate之后呢
再重新起起来
但是这里也许有一种更好的解决方法:用参数”-F”代替”-f”
-F“相当于”–retry -f
用这个参数,就算原来的log文件被重建
tail还能重新打开新的log文件,继续接收log内容

我做过简单的测试
在一个shell里用一个脚本不停地往一个log文件里写东西
在另外一个shell里用tail -f来读
当第一个shell里停掉程序,删掉log文件,再重启程序(同时重建了log文件)的时候
另外那个shell里读这个log文件的tail再没有任何新的显示
但如果我们用tail -F来读
同样在头一个shell里那样处理后
这边出一个“

tail: ‘xxxxxx’ has been replaced; following end of new file


的提示后又接着显示log文件里的内容了

linux下用mime发带附件的邮件

如果你的系统装有metamail这个rpm包的话

则命令metasend可以用来发带附件的邮件

如果没装这个软件包呢 那就装上:)

metasend -b -t $RECEIVE_MAIL -S 100000000 -s "$MYSQL_BACKUP_DATABASE_FILENAME `date +%y-%m-%d`.tar.gz" -f $BACKUP_PATH/$MYSQL_BACKUP_DATABASE_FILENAME-`date +%y-%m-%d`.tar.gz -m application/octet-stream -e base64

这个是别人写的

我只拿来用用

怎样在linux下用命令发带附件的邮件

简单讲

就是把要当作附件发的文件uuencode一下

然后再把编过码之后的文件当作邮件正文发出去

一句话的命令就是

cat <attachfile> | uuencode <attachname> | mail -s <subject> <targetemailaddress>

比如我要把文件hello.gif当作附件发给haha@pei.com

邮件标题用hello

那么我会这样

cat hello.gif | uuencode hello.gif | mail -s "hello" haha@pei.com

注意:命令uuencode在rpm包sharutils里 

what’s meaning of “configure: error: cannot run /bin/sh config/config.sub”

编一个东西的时候
执行./configure的时候出的错

“configure: error: cannot run /bin/sh config/config.sub”

结果发现是系统没有装libtool的缘故
所以yum install libtool
然后再./configure则没有这个问题了

linux下crontab中的命令行中含有”%”的话前面一定得加转移符”\”

其实这跟Linux关系不大

倒是跟shell很是相关

其实还是跟crontab最相关:)

当时crontab的log出错信息是:

/bin/sh: -c: line 0: unexpected EOF while looking for matching “’

/bin/sh: -c: line 1: syntax error: unexpected end of file

下面这是从命令man 5 crontab中摘出的一段话:

        The entire command portion of the line, up to  a  newline  or  %

 character,  will  be  executed by /bin/sh or by the shell specified in

 the SHELL variable of the cronfile.  Percent-signs (%) in the command,

 unless  escaped with backslash (\), will be changed into newline char-

 acters, and all data after the first % will be sent to the command  as

 standard input.

意思就是说crontab将忽略"%"后面的字串

把其当作前面命令的输入部分

而且还有个crontab的例子

用来说明这个:

0 22 * * 1-5   mail -s "It’s 10pm" joe%Joe,%%Where are your kids?%


 

unix下怎样删除文件名以”-”开头的文件呢

原文是英文的,在这里

最简单的办法就是

rm ./-filename

(这里"-filename"在当前目录下)

很多命令,尤其是那些使用"getopt(3)"做常规参数解析的

会接受"–"作为参数,而且这意味着“这是最后一个选项”

所以,你的rm的版本也许能够操作"rm — -filename"这种方式

还有一些没有用getopt()的版本的rm认为单个"-"跟上面提到的"–"一样的作用

所以在这种版本的rm,可以用命令"rm - -filename"

Mailing Attachments from UNIX(从UNIX下发带附件的邮件)

Sending email with attachments on UNIX systems(UNIX系统下发带附件的邮件)

以下的例子都使用了下面的这几个变量

TXTFILE=/tmp/textfile

ATTFILE=/tmp/binary_file

SUBJECT="Your attachment"

MAILTO=user@where.ever

一共可以有n种办法

下面列出几种

  1. uuencode
    uuencode $ATTFILE $ATTFILE | \
        mail -s "$SUBJECT" $MAILTO
        (uuencode $FILE1 $FILE1; uuencode $FILE2\
        $FILE2)| mail -s "$SUBJECT" $MAILTO
  2. simple shell commands
    echo "From: $LOGNAME\n\
        To: $MAILTO\nSubject: $SUBJECT\n\
        Mime-Version: 1.0\n\
        Content-Type: text/plain\n\
        " > /tmp/file
        cat $TXTFILE >> /tmp/file
        /usr/lib/sendmail -t -oi < /tmp/file
        
  3. metamail
       metasend -b -s "$SUBJECT"\
        -f $TXTFILE -m text/plain -e none -n \
        -f $ATTFILE -m application/octet-stream \
        -e base64 -t $MAILTO
        
  4. mpack
       mpack -s "$SUBJECT" -c \
        application/octet-stream $ATTFILE $MAILTO
        
  5. mutt
       mutt -a $ATTFILE -s "$SUBJECT" $MAILTO <\
        $TXTFILE
        
  6. Elm
       elm -s"$SUBJECT" -A $ATTFILE $MAILTO < $TXTFIL 
  7. Pine - (to be investigated but it doesn’t look good; maybe the c-client?)
  8. uuenview
        uuenview -m $MAILTO -b -a $ATTFILE < $TXTFILE
  9. nail
    nail -s "$SUBJECT" -a $ATTFILE $MAILTO < $TXTFILE
        
  10. Z-Mail
    For a single file:
        cat $TXTFILE | zmail.small -subject "$SUBJECT"\
        -attach application/octet-stream:${ATTFILE}\
        $MAILTO Bart Schaefer offers the following\
        for multiple attachments.\
        (untested by myself)
        zmail.small -rf /dev/null -e \
        'mail -z -s "$SUBJECT" $MAILTO' \
        -e 'compcmd attach-file $ATTACHFILE \
        application/msword base64 \
        "$DESCRIPTION"' \
        -e! 'compcmd send'

用rpm来重新为rpm文件签名

前两天

从网上下了一个apt的rpm

本想用于自己的apt respon

但apt-get安装时需要签名

我又不想import别人的签名

所以

想用自己的签名替换一下

于是

rpm –resign apt-xxxxx.rpm

搞定。

其实

从rpm4.3开始

rpm –addsign的效果跟rpm –resign是一样的

–addsign–resign这两个参数是一样的

但为什么会有两个不同的参数呢

manual上讲是由于"historical reasons"(历史原因)

RedHat下做yum server的自动化程序up2date2yum

这是从网上这里搜到的
怕什么时候什么原因不能访问了
所以转贴到这里:

#!/bin/sh
#
# $Id: up2date2yum,v 1.1 2005/06/27 20:07:34 jmates Exp $
#
# Converts RPMs from up2date into a YUM repository. Consults both base
# packages (under redhat/3AS/i386 for RHEL3 AS on i386) and updates
# (redhat/updates/3AS/i386), though only updates the updates directory.

# where YUM data stored on system, e.g. /var/www/yum
YUMDIR=FIXME_YUM_DIR

# ‘3AS’ on RHEL3 systems
releasever=`rpm -q –qf ‘%{VERSION}’ redhat-release`

# should be i386 or x86_64
basearch=`uname -i`

up2date –showall | xargs up2date -k $YUMDIR/redhat/$releasever/$basearch/RPMS/:$YUMDIR/redhat/updates/$releasever/$basearch/RPMS/ –get

find /var/spool/up2date -type l -print0 | xargs -0 rm -f
find /var/spool/up2date -type f -iname ‘*.rpm’ -exec mv {} $YUMDIR/redhat/updates/$releasever/$basearch/RPMS/ \;

pushd $YUMDIR/redhat/updates/$releasever/$basearch/
yum-arch -q .
popd