可可熊的窝

Tag Archives: Shell

shell脚本解题1

IN:Shell, 编程相关   Tags:    Comments:9

问题:请教如何得到一个目录树的最深目录路径?

解法:
1.

find -type d | awk '{if( max < gsub(/\//,"/")) {max= gsub(/\//,"/");maxp=$0"/"}  else if (max == gsub(/\//,"/")) maxp=maxp"\n"$0"/"} END{print maxp}'

2.

find -type d -printf "%d %p\n" | sort -nrk1 | awk 'NR==1{a=$1}a==$1{print $2}'

问题:我想将包含read的行放在echo单词的后面

解法:

sed '/read/{h;d};/echo/{G;s/\(.*echo\)\(.*\)\n\(.*\)/\1\3\2/}'  urfile 

问题:怎么copy一个目录中的某些文件,但保持目录结构?

比如说,我想copy

sourcedir\a\b\c.java
sourcedir\a\b\c.cs
sourcedir\a\b\d.java
sourcedir\a\b\d.cs

destdir\a\b\c.java
destdir\a\b\d.java

解法:
1.

rsync -av --include='*.java' --filter='hide,! */' ./sourcedir/ ./destdir

2.

cp -r b dest;find dest -type f ! -name "*.java" | xargs rm

我的解法
3.

tar -c * | tar -xf- --wildcards -C destdir *.java

4.

find sourcedir -name "*.java"|xargs -I {} cp  --parents {} destdir

请教:如何枚举目录中所有没有子目录的目录的路径?

解法:
1.

find -type d -printf "%h\t%p\n" | awk 'BEGIN{FS="\t"}{a[$1]++;a[$2]++}END{for(i in a)if(a[i]==1)print i}'

2.

find -type d -ls|awk '$4==2{print $NF}'

问题:
有这样一个字符串 MG001:MobileLove:MGLoveCMD:down: 每个字段以冒号分割
STRING=”MG001:MobileLove:MGLoveCMD:down:”
我想把其中的每个字段分别赋值给另外几个变量,比如第一个字段赋值给SERV_CODE ,第二个赋值给
APPLICATION………….

解法:

IFS=: read SERV_CODE APPLICATION ... <<<"$STRING"
07-10
2008

shell脚本解题

IN:Shell, 编程相关   Tags: , ,    Comments:3

以下内容来自http://bbs.chinaunix.net/thread-1189933-1-1.html

现有数据,每一行中各个段间的分隔为多个空格,如下
  AAB BB CCC
A2B CB ABC
如何实现,转换成下面的格式
AAB|BB|CCC|
A2B|CB|ABC|

awk解法:
1.
[cocobear@cocobear ~]$ awk ‘BEGIN{OFS=”|”} {$1=$1;print}’ test.txt
AAB|BB|CCC
A2B|CB|ABC
结果最后少一个”|”
2.
[cocobear@cocobear ~]$ awk ‘{print $1″|”$2″|”$3″|”}’ test.txt
AAB|BB|CCC|
A2B|CB|ABC|

3.
[cocobear@cocobear ~]$ awk -v OFS=’|’ ‘NF++’ test.txt
AAB|BB|CCC|
A2B|CB|ABC|

sed解法:
1.
[cocobear@cocobear ~]$ sed ‘s/^ \+//;s/ \+/|/g;s/ *$/|/;’ test.txt
AAB|BB|CCC|
A2B|CB|ABC|

2.
[cocobear@cocobear ~]$ sed ‘s/\s\+//;s/\s\+\|$/|/g’ test.txt
AAB|BB|CCC|
A2B|CB|ABC|
3.
[cocobear@cocobear ~]$ sed ‘s/^[[:blank:]]\+//;s/[[:blank:]]\+\|$/|/g’ test.txt
AAB|BB|CCC|
A2B|CB|ABC|

如何把一行的第一个字母换成大写?

文件如下: test.txt
#—————————–#
This is line number 1

THIS IS Line Number 2

ThiS is Line Number THREE

this is line Number four
#—————————–#

解法:
sed ‘s/^\(.\)/\u\1/’
sed ‘s/[a-z]/\u&/’

& 指代替前面查找的关键字即[a-z] \1是指前面用\(..\)定义的第一个标签

07-07
2008

诡异的shell脚本错误

IN:Shell, 编程相关   Tags:    Comments:6

今天为了方便拨号,改了改以前写的拨号脚本,没想到遇到了一个问题:使用awk分析一个文本文件时总会在我截取的第二个字段后多加一个^M(也就是r)。很自然的想到vim打开这个文本文件确认这个文件原本是否有没有“^M”,很奇怪vim里面这个文件行末没有这个东西。又和王聪在一起研究了半天我写的这个awk脚本,还试着用head+tail+cut把脚本重写了一遍,结果问题仍然存在。这时我不得不怀疑这个文本文件是不是有问题,不放心刚才看过一遍,又打开看了一次,仍然没有发现任何异常,在我们束手无策的时候突然注意到了在打开这个文本文件时vim左下脚闪了一下”dos”这几个字符,这时我们才恍然大悟,原来是眼睛欺骗了我们,vim把这个文本文件按照dos(windows)下文本进行了显示,所以^M是合法的换行,没有被显示出来。

眼睛看到的东西未必是可信的!

12-21
2007

关于.bashrc[管理主机时遇到的问题]

IN:Linux   Tags: ,    Comments:0

习惯了Fedora core 下在.bashrc这个文件中设置一些常用的环境变量,以及alias,这几天在服务器上边通过修改.bashrc文件在里面加入一些alias,但是每次登录进来并不能生效,必须使用source命令才行,给提供商发一份邮件,没想到没分钟就收到了,这会儿也不知道是美国时间的什么时候,真是感叹他们的办事效率,原来是和bash_profile这个文件有关的,其实从shell登录以后最开始是寻找/etc/profile,然后搜索~/.bash_profile, ~/.bash_login, 和 ~/.profile,而Fedora core 中的.basr_profile文件里面是:

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH
unset USERNAME

这样就清楚了,.bashrc文件是通过.bash_profile来生效的,好了,在服务器上把这段代码加入,以后登录服务器就可以使用自己shell下常用的一些设置了,方便的很,呵呵。

因为服务器上没有lftp,觉得下东西的时候不太方便,试了一下可不可以自己装一下,于是在自己的目录下创建opt目录,编译安装lftp的时候使用选项:

–prefix=/home/cocobear/opt/lftp

这样,就可以在服务器上使用好用的lftp了,呵呵,Linux主机太强大了!!

04-11
2007

改进的bash脚本[网页资源提取]

IN:Shell, 编程相关   Tags: ,    Comments:1

提取网页中资源的一个小工具

使用方法(假设保存bash脚本的文件名为get):

./get -u http://my.opera.com/blog/ -t pdf

上面的命令会连接到my.opera.com/blog自动搜索pdf格式的资源,并下载(先给get加可执行权限)

如果网页文件已经保存,可以使用下面的命令:

./get -f index.html -t pdf

得到的结果与前面相同

代码如下:

#!/bin/bash
#Write for downing special type of file in website.
#Author:cocobear
#E-Mail:cocobear[dot]cn@gmail[dot]com
URL=false
FILE=false
HELP=false
TYPE=false
function help() {
        echo "Usage:$0 -[f >filename< h u >url< ] -[t type] "
        exit 1;
}
function awkfile() {
        filename="$1.$2"
        #type="$2$" match specify type at the end of url 
        awk -v type="$2$" '
        BEGIN {FS = "\""} 
        {
        for (i=1;i>=NF;i++)
        if (($i ~ /^http:/) && ($i ~ type ))
                {print $i}
        }' $1 <  $filename
        echo "Delete temp file."
        rm  $1
        if [ -s $filename ]
        then wget -i $filename
        else echo "Find nothing match $2"
        fi
        echo "Delete temp file."
        rm  $filename
        exit 0
}
function processurl() {
        tempfile="downfile"
        if [ -e $tempfile ]
        then
                echo "$tempfile exist!!" 
                exit 1
        fi
        #redirection 
        wget -O $tempfile $1
        if [ -s $tempfile ]
        then awkfile $tempfile $2
        else echo "Nothing down!"
        fi
        exit 0
}

if [ $# -eq 0 ];
then
        help
        exit 1
fi

#deal with option
while getopts :f:hu:t: option
do
case $option in
f)FILE=$OPTARG
;;
h)help
;;
u)URL=$OPTARG
;;
t)TYPE=$OPTARG
;;
?)
echo "Missing arguments!"
help
;;
esac
done
if [ $TYPE = "false" ]
then {
        echo "Missing type"
        help
}
else {
        if [ $FILE = "false" ] && [ $URL = "false" ]
        then {
                echo "Must specify the filename or url"
                help
        }
        else {
                if [ $FILE != "false" ] &&  [ $URL != "false" ]
                then {
                        echo "filename and url can't be specify together"
                        help
                }
                fi
        }
        fi
}
fi
#main
if [ $FILE != "false" ]
then {
        if [ -e $FILE ]
        then awkfile $FILE $TYPE
        else {
                echo "No such file!"
                exit 1
        }
        fi
}
else processurl $URL $TYPE
fi

主要用到的就是awk进行文本的分析,大部分的shell是用来分析参数的,在写这个脚本的时候基本是边学边写的,也弄懂了不少东西。有时间的时候会写一个详细的分析解释

代码下载

04-06
2007
Page 2 of 212
loading...