可可熊D窝

Keep it simple, stupid


  • 首页

  • 关于

  • 标签182

  • 分类8

  • 归档359

  • 搜索

shell脚本解题5

发表 2008-07-24 | 分类 编程相关 | 评论数:
| 字数: 1.1k | 阅读 ≈ 1 分钟

问题:
随机输出目录下5个文件:

解法:
1.

#! /bin/bash
arr=($(ls *.sql.gz))
len=$((${#arr[@]}+1))

for((i=1;i<6;i++))
do
        RANDOM=$(($$+i))
        echo ${arr[$((RANDOM%len))]}
done

这种方法有可能会产生重复的文件。
2.
ls ‘BEGIN {srand()} {A[NR]=$0;} END {for(i=0;i<5;++i) { n=int(rand()FNR)+1; print A[n]} }’
同样这个也有可能重复。
3.
ls *sql.gz | awk ‘BEGIN{srand()}{a[rand()” “NR]=$0}END{for(i in a) {print a[i];if(++j==5) break}}’

将600个同一目录下的文件随机分成3份,每份200个:

解法:
1.

ls | awk ‘BEGIN{srand();b[1]=”path1”;b[2]=”path2”;b[3]=”path3”}{a[rand()” “NR]=$0}END{for(i in a){if(k++%200==0) j++;print “mv “a[i]” “b[j]}}’ | sh

对这样的代码进行缩进:
void func1()
{
if()
{
printf();
}
return;
}

void func2()
{
if()
{
printf();
}
return;
}

解法:
1.

awk ‘/}/{flag–}{if(flag>0) for(i=1;i< =flag;i++) printf “\t”;print}/{/{flag++}’

打印字符串hello上下两行,不允许使用grep.

解法:
1.
awk -v n=2 ‘{a[NR%n]=$0}/hello/{for(i=NR-n+1;i< =NR;i++) if(i>0) print a[i%n];i=0;while(i<n && getline){print;i++}}’

查看23号15点到24号13点之间的系统日志:
sudo cat /var/log/messages | awk ‘$2” “$3 >= “23 15:00:00” && $2” “$3 <= “24 13:00:00”‘

shell脚本解题4

发表 2008-07-18 | 分类 编程相关 | 评论数:
| 字数: 1.1k | 阅读 ≈ 1 分钟

问题:
用sed把每行的第二个字符到第六个字符替换成星号
原文
123456
1234567
12345

要求结果

1*
1*7
1**

解法:
1.

sed ‘/^../{h;s/^.(.{1,5})./\1/;s/.//g;G;s/(.)\n(.).{1,5}(.)/\2\1\3/}’

2.
sed -r ‘/.{6}/bb
:a
s/(.*)[^]/\1*/
ta
b
:b
/^.*{5}/! {
s/(.*)[^]/\1*/
tb
}’
3.
awk ‘{a=(substr($0,2,5));gsub(/./,”*”,a);print substr($0,1,1)a””substr($0,7,length($0))}’

4.
sed ‘s/^(.)(.{1,5})(.)/\1\n\2\n\3/‘ file | sed ‘{n; s/.//g;n}’ | sed ‘{N; N; s/\n//g}’

5.
sed ‘:a;/^.[]{5}/!{s/(.[])./\1/;/*$/!ta}’[/bash]

问题:
比较2008-01-29和2008-02-1之间相差月份

解法:
1.

echo “$date1-$date2” | awk -F’-‘ ‘{a=($1-$4)12+($2-$5);print sqrt(aa)}’

Comments

luguo: 第1个的perl解法: perl -ne ‘chomp; $i= length($) > 6? 5: length($)-2; substr($, 1, $i)=”*”x$i; print “$\n”;’ test.txt

luguo: Oops! 应该是:perl -ne ‘chomp; $i= length($) > 6? 5: length($)-1; substr($, 1, $i)=”*”x$i; print “$\n”;’ test.txt

luguo: 或者更简单的: perl -ne ‘$i= length($) > 7? 5: length($)-2; substr($_, 1, $i)=”*”x$i; print;’ test.txt

luguo: 第2个: echo ‘2008-01-2007-12’ | perl -ne ‘($a, $b, $c, $d)=split/\-/; print abs(($a-$c)*12+$b-$d), “\n”;’

shell脚本解题3

发表 2008-07-16 | 分类 编程相关 | 评论数:
| 字数: 639 | 阅读 ≈ 1 分钟

问题:
如何将命令的输出信息按行放入到数组里面?

解法:
1.

n=0
while read line;do
array[$n]=”$line”
((n++))
done < <(traceroute 192.168.1.1 -n)

echo ${array[0]}

问题:
sed 可以同时匹配多个条件?

比如
file:
AAA BBB CCC DDD
AAA BBB DDD
CCC DDD

sed能实现,同时匹配AAA和CCC就打印,在一条命令中

解法:
1.
sed -n ‘/AAA/{/CCC/p}’

同时匹配kobe和james:
sed -n ‘/kobe/{/james/p}’
awk ‘/kobe/&&/james/{ print $0 }’

匹配kobe或james:
sed -n ‘/(kobe|james)/p’
awk ‘/kobe/||/james/{ print $0 }’
seq 5|sed ‘$!N;$!D’

Comments

luguo: 恩,第一个中那个重定向用得不错。 我的第2个的解法: perl -ne ‘print if /AAA/ && /CCC/;’ test.txt

wind: 娃最近怎么天天脚本呢?

cocobear: 那你说我做什么啊。这儿有个驱动,你帮我写写吧。我不会。

shell脚本解题2

发表 2008-07-15 | 分类 编程相关 | 评论数:
| 字数: 1.6k | 阅读 ≈ 1 分钟

问题:
如下文本

60.208.0.224
60.208.103.192
131.9.124.72
60.208.20.119
60.208.20.9
2.110.213.40
8.56.32.24
60.53.37.128
60.3.98.1

怎么先按ip的第一位sort,然后按第二位sort,然后按第三,第四

结果是这样
2.110.213.40
8.56.32.24
60.3.98.1
60.53.37.128
60.208.0.224
60.208.20.9
60.208.20.119
60.208.103.192
131.9.124.72

解法:
1.
sort -t. -k1,1n -k2,2n -k3,3n -k4,4n

2.
sed ‘s/./ /g’ urfile|sort -nt ‘ ‘ -k1 -k2 -k3 -k4|sed ‘s/ /./g’

问题:
httpd.conf文件中含有以下内容,要把Directory块中含有/usr/local/apache/cgi-bin这一块注释掉:

Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all

<directory "/usr/local/apache/cgi-bin">
AllowOverride None
OptionsNone
Orderallow,deny
Allow fromall
</directory>

<directory "/var/www/icons">
    Optioin Index
    Allow all
</directory>

解法
1.

sed -r ‘/^(<directory .cgi-bin.)/{s/^/#/;:a;n;/^$/!s/^/#/;ta} ‘ httpd.conf
今天写的最长的一行。

2.

sed ‘/^<directory .cgi-bin./,/^<\/Directory>/s/^/#/; ‘ httpd.conf
sed替换大全:

sed ‘s/foo/bar/‘ # 替换第一次出现
sed ‘s/foo/bar/4’ # 替换第四次出现
sed ‘s/foo/bar/g’ # 替换所有的出现
sed ‘1s/foo/bar/‘ # 替换第一行第一次出现

Comments

luguo: 第1个的perl解法: perl -n -e ‘push @foo, $_; END {print sort {pack(“C4”,split(/\./,$a)) cmp pack(“C4”,split(/\./,$b))} @foo;}’ test.txt

dream: 1. sed ‘s/\./ /g’ urfile|sort -nt ‘ ‘ -k1 -k2 -k3 -k4|sed ‘s/ /./g’,这行为什么不像解1中需要 -k1,1 -k2,2,而只是-k1 -k2, btw, 为什么要,1 ,2 ,3…看了半天manpage 没看懂。 2. sed -r ‘/^(<Directory.cgi-bin.)/{s/^/#/;:a;n;/^$/!s/^/#/;ta} ‘ httpd.conf,这行有点太难懂了… orz 3. 最后一个sed 解释,赞!

cocobear: perl的看着好怪啊! 1,2,3是把每一行的内容分段进行sort;第二种解法把.替换为空格,sort默认是按空格进行分段,所以就不需要指定POS2了。

dream: hehe 明白了,谢谢讲解

sed的几个选项

发表 2008-07-11 | 分类 编程相关 | 评论数:
| 字数: 1.5k | 阅读 ≈ 1 分钟

sed中有些选项不太好理解,今天就顺一顺:

几个命令:
n
把下一行输入读入模式空间中.当前行被发送到标准输出,下一行将成为当前行.控制将被转移给n后面所跟的命令,而不是回到脚本开始处.

N
把下一行输入行添加到模式空间的内容之后;这两行文本用一个插入的换行符分隔开.

p
打印出寻址到的行.除非使用命令行选项-n,否则该命令会导致输出相同的行.

这里有一段对D的解释
函数参数 D 表示删除 pattern space 内的第一行资料。其指令格式如下:

[address1,address2]D 

对上述格式有下面几点说明 :

函数参数 D 最多配合两个位址参数。
函数参数 D 与 d 的比较如下 :
当 pattern space 内只有一资料行时 , D 与 d 作用相同。
当 pattern space 内有多行资料行时
D 表示只删除 pattern space 内第一行资料 ; d 则全删除。
D 表示执行删除後 , pattern space 内不添加下一笔资料 , 而将剩下的资料重新执行 sed script ; d 则读入下一行後执行 sed script。

几个选项:
-e script
执行后面的脚本

-n
禁止自动打印模式空间的内容

例子:

[cocobear@cocobear test]$ cat 1
1
2
3
4
5
6
7
8
9

[cocobear@cocobear test]$ sed -e 'n' -e 'd' 1
1
3
5
7
9

sed读入第一行内容,执行命令’n’,把第二行读入模式空间,向标准输出第一行内容,第二行成为当前行,然后执行后面的命令’d’,’d’命令删除模式空间内容(也就是第二行内容),该行处理完成,接下来处理第三行,依此进行.

[cocobear@cocobear test]$ sed -e 'n' -n -e 'p' 1
2
4
6
8

sed读入第一行内容,执行命令’n’,把第二行读入模式空间,向标准输出第一行内容,但由于使用了-n选项,所以这里就没有输出;第二行成为当前行,然后执行后面的命令’p’,’p’命令输出模式空间内容(也就是第二行内容),该行处理完成,接下来处理第三行,依此进行.

[cocobear@cocobear test]$ sed -e 'N' -e 'd' 1
9

sed读入第一行内容,执行命令’N’,把第二行添加到模式空间中,然后执行后面的命令’d’,’d’命令删除模式空间内容(也就是第一+第二行内容),该行处理完成,接下来处理第三行,依此进行.

[cocobear@cocobear test]$ sed -e 'N' -n -e 'p' 1
1
2
3
4
5
6
7
8

sed读入第一行内容,执行命令’N’,把第二行添加到模式空间中,然后执行后面的命令’p’,’p’命令打印模式空间内容(也就是第一+第二行内容),由于-n选项,处理完后sed不会自己再次打印该行处理完成,接下来处理第三行,依此进行.处理完第七行后,使用’N’命令时出错,sed退出.

Comments

dream: hehe 谢谢分享

luguo: http://www.catonmat.net/blog/wp-content/plugins/wp-downloadMonitor/user_uploads/sed.stream.editor.cheat.sheet.txt

1…232425…72
cocobear

cocobear

爱折腾的技术宅一枚

359 日志
8 分类
182 标签
RSS
GitHub E-Mail Twitter 豆瓣
友情链接
  • 王聪
  • 老大
0%
© 2007 – 2020 cocobear | 521k | 7:54
由 Hexo 强力驱动 v3.9.0
|
主题 – NexT.Gemini v6.7.0
Hosted by GitHub Pages