Tag Archives: Shell
IN:Shell, 编程相关 Tags: Shell 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"
IN:Shell, 编程相关 Tags: awk, sed, Shell 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是指前面用\(..\)定义的第一个标签
IN:Shell, 编程相关 Tags: Shell Comments:6今天为了方便拨号,改了改以前写的拨号脚本,没想到遇到了一个问题:使用awk分析一个文本文件时总会在我截取的第二个字段后多加一个^M(也就是r)。很自然的想到vim打开这个文本文件确认这个文件原本是否有没有“^M”,很奇怪vim里面这个文件行末没有这个东西。又和王聪在一起研究了半天我写的这个awk脚本,还试着用head+tail+cut把脚本重写了一遍,结果问题仍然存在。这时我不得不怀疑这个文本文件是不是有问题,不放心刚才看过一遍,又打开看了一次,仍然没有发现任何异常,在我们束手无策的时候突然注意到了在打开这个文本文件时vim左下脚闪了一下”dos”这几个字符,这时我们才恍然大悟,原来是眼睛欺骗了我们,vim把这个文本文件按照dos(windows)下文本进行了显示,所以^M是合法的换行,没有被显示出来。
眼睛看到的东西未必是可信的!
IN:Linux Tags: Linux, Shell 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主机太强大了!!
IN:Shell, 编程相关 Tags: awk, Shell 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是用来分析参数的,在写这个脚本的时候基本是边学边写的,也弄懂了不少东西。有时间的时候会写一个详细的分析解释
代码下载