Category 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:Shell, 编程相关 Comments:3for f in *;do
mv $f `echo $f |tr “[A-Z]” “[a-z]“`
done
上面这个脚本可以处理大多数情况,但是当文件名中有空格时该脚本就无效了。
经过尝试下面这段脚本可以解决上面的问题:
[cocobear@cocobear 1027]$ cat re.sh
mv “$1″ “`echo $1 | tr ‘[A-Z]‘ ‘[a-z]‘`”
[cocobear@cocobear 1027]$ find ./ -type f -exec ./re.sh ‘{}’ \;
再想一想其实最前面的代码也一样能解决问题,也是需要在mv的两个参数的变量名上加上双引号:
for f in *;do
mv “$f” “`echo $f |tr “[A-Z]” “[a-z]“`”
done
我刚开始改的时候只对`echo $f | tr “[A-Z]” “[a-z]“`用了双引号,结果出现下面的错误:
mv: 目标 “dscn6208 [1600x1200].jpg” 不是目录
解释:
shell传递参数默认是按照空格来区分的,因此当文件名里有空格时传递参数的过程中就会被认为是传递了两个参数,这样如果$f没有使用双引号的话”dscn6208 [1600x1200].jpg”就会被认为两个文件,相当于:
mv dscn6208 [1600x1200].jpg “dscn6208 [1600x1200].jpg”
mv会认为第三个参数是文件夹,所以会提示目标“dscn6208 [1600x1200].jpg”不是目录。
IN:Shell, 编程相关 Comments:2请注意06年下半年(7月份以后)的地址变了,是这样的:
http://download.putclub.com/update/standard/VOA/200607/2006VOA0701.mp3
可以把脚本稍做修改,然后接着下后半年的,当然也可以在脚本中做个判断,自动选择,懒得弄了:-)
BTW:我在宿舍下载很慢,有时都几乎连接不上去,郁闷,现在在DH的服务器上下载呢,呵呵.
查看源码
下载源码
IN:Shell, 编程相关 Comments:2
- 加了几个简单的注释,怕时间长了不记得了。
- 修改/etc/syslog.conf文件后重起syslog进程,这样就不用重启电脑了。
- 修改每次在IFCFG文件中更改用户使用的方法,以前那种方式会造成在F7中产生两个USER选项。
- 增加对IFCFG文件的存在测试。
- 对IFCFG文件中的CONNECT_TIMEOUT进行自动修改。
- 增加对2位数字号段的支持。也就是你可以一次验证1000个帐号。
- 增加手动设定开始与结束帐号,不过设定这两项的时候必须使用4个参数,其中第一个参数被重置,变为无效,这个做得不太好,以后再说吧。
- 似乎没了
我在F7上测试通过:-)
查看代码
代码下载
Update1:经过草儿同学的测试,发现了一些问题,目前已经解决。