求脚本!!!!

sh/bash/dash/ksh/zsh等Shell脚本
killer2001
帖子: 16
注册时间: 2010-07-09 20:28

Re: 求脚本!!!!

#16

帖子 killer2001 » 2011-08-04 8:50

我就是我2 写了:这么多人写。有压力啊。 :em06
不会ruby、python
[bash]data=$(grep "compt" a.dat | awk -F "=" '{print "\"" $2 "\"," }' | tr a-z A-Z | tr -d '\n' | sed 's/,$//')
echo "ss=$data"
[/bash]
都得到差不多的结果哦。
[uidt5100@home]$ data=$(grep "compt" a.dat | awk -F "=" '{print "\"" $2 "\"," }' | tr a-z A-Z | tr -d '\n' | sed 's/,$//')
[uidt5100@home]$ echo "ss=$data"
","COMPT_C
[uidt5100@home]$
killer2001
帖子: 16
注册时间: 2010-07-09 20:28

Re: 求脚本!!!!

#17

帖子 killer2001 » 2011-08-04 9:04

fnan 写了:lz的方法也可以啊,不过有些细节不易想到,先不写出来。
按我写的那个,在for里每次$each都没问题,但是赋值给ss的时候就不行了,覆盖了原来的ss?

[uidt5100@home]$ ss=""
[uidt5100@home]$ for each in `cat a.dat |grep "compt" | cut -d"=" -f2 |tr a-z A-Z`
> do
> echo $each
> ss=\"$ss\",\"$each\"
> done
COMPT_A
COMPT_B
COMPT_C
[uidt5100@home]$ echo $ss
"","COMPT_C"","
[uidt5100@home]$
头像
link_01
帖子: 1024
注册时间: 2008-11-05 13:24

Re: 求脚本!!!!

#18

帖子 link_01 » 2011-08-04 9:58

我也试着写一个
[bash]
ss=$(awk -F"=" '/compt/{ printf "\"%s\",",$2 }' a.dat|sed -nr 's/(.+),$/\1/p'|tr a-z A-Z); echo "ss=$ss"
[/bash]
刚才没看到ss是字符串的一部分
笔记
-------------------------------------
http://blog.163.com/wqt_1101
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

Re: 求脚本!!!!

#19

帖子 我就是我2 » 2011-08-04 10:35

killer2001 写了:
我就是我2 写了:这么多人写。有压力啊。 :em06
不会ruby、python
[bash]data=$(grep "compt" a.dat | awk -F "=" '{print "\"" $2 "\"," }' | tr a-z A-Z | tr -d '\n' | sed 's/,$//')
echo "ss=$data"
[/bash]
都得到差不多的结果哦。
[uidt5100@home]$ data=$(grep "compt" a.dat | awk -F "=" '{print "\"" $2 "\"," }' | tr a-z A-Z | tr -d '\n' | sed 's/,$//')
[uidt5100@home]$ echo "ss=$data"
","COMPT_C
[uidt5100@home]$
以下我运行结果。可能是一些细节有问题吧。不知道样本a.dat有没错。 x1=foobar是我自己添加的。
在bash和zsh的结果都是一样的。
$ cat a.dat
x1=foobar
y1=compt_a
y2=compt_b
y3=compt_c
$ data=$(grep "compt" a.dat | awk -F "=" '{print "\"" $2 "\"," }' | tr a-z A-Z | tr -d '\n' | sed 's/,$//')
$ echo "ss=$data"
ss="COMPT_A","COMPT_B","COMPT_C"
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
killer2001
帖子: 16
注册时间: 2010-07-09 20:28

Re: 求脚本!!!!

#20

帖子 killer2001 » 2011-08-04 10:56

我就是我2 写了:
killer2001 写了:
我就是我2 写了:这么多人写。有压力啊。 :em06
不会ruby、python
[bash]data=$(grep "compt" a.dat | awk -F "=" '{print "\"" $2 "\"," }' | tr a-z A-Z | tr -d '\n' | sed 's/,$//')
echo "ss=$data"
[/bash]
都得到差不多的结果哦。
[uidt5100@home]$ data=$(grep "compt" a.dat | awk -F "=" '{print "\"" $2 "\"," }' | tr a-z A-Z | tr -d '\n' | sed 's/,$//')
[uidt5100@home]$ echo "ss=$data"
","COMPT_C
[uidt5100@home]$
以下我运行结果。可能是一些细节有问题吧。不知道样本a.dat有没错。 x1=foobar是我自己添加的。
在bash和zsh的结果都是一样的。
$ cat a.dat
x1=foobar
y1=compt_a
y2=compt_b
y3=compt_c
$ data=$(grep "compt" a.dat | awk -F "=" '{print "\"" $2 "\"," }' | tr a-z A-Z | tr -d '\n' | sed 's/,$//')
$ echo "ss=$data"
ss="COMPT_A","COMPT_B","COMPT_C"
难道是我系统有问题啊,我这里还是不行!

[uidt5100@home]$ cat a.dat
x1=foobar
y1=compt_a
y2=compt_b
y3=compt_c[uidt5100@home]$ data=$(grep "compt" a.dat | awk -F "=" '{print "\"" $2 "\"," } A-Z | tr -d '\n' | sed 's/,$//')
[uidt5100@home]$ echo "ss=$data"
","COMPT_C"
[uidt5100@home]$
MaskRay
帖子: 61
注册时间: 2010-04-29 22:00
系统: Gentoo Linux ~amd64
联系:

Re: 求脚本!!!!

#21

帖子 MaskRay » 2011-08-04 15:12

Haskell

代码: 全选

ghc -e "interact\$concat.(\"ss=\":).Data.List.intersperse\",\".map((++\"\\\"\").('\"':).map(Data.Char.toUpper).tail.dropWhile(/='=')).lines"
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

Re: 求脚本!!!!

#22

帖子 我就是我2 » 2011-08-04 15:18

y3=compt_c[uidt5100@home]$ data=$(grep "compt" a.dat | awk -F "=" '{print "\"" $2 "\"," } A-Z | tr -d '\n' | sed 's/,$//')
命令没有输错先,希望不是文字错误。
复制,保存为脚本test.sh。 :em20
set 是调试用的。
[bash]
#!/bin/bash
set -x
DATA=$(grep "compt" a.dat | awk -F "=" '{print "\"" $2 "\"," }' | tr a-z A-Z | tr -d '\n' | sed 's/,$//')
echo "ss=$DATA"
set +x
exit 0
[/bash]
运行结果
./test.sh
++ grep compt a.dat
++ tr a-z A-Z
++ awk -F = '{print "\"" $2 "\"," }'
++ tr -d '\n'
++ sed 's/,$//'
+ DATA='"COMPT_A","COMPT_B","COMPT_C"'
+ echo 'ss="COMPT_A","COMPT_B","COMPT_C"'
ss="COMPT_A","COMPT_B","COMPT_C"
+ set +x
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

Re: 求脚本!!!!

#23

帖子 我就是我2 » 2011-08-04 15:20

MaskRay 写了:Haskell

代码: 全选

ghc -e "interact\$concat.(\"ss=\":).Data.List.intersperse\",\".map((++\"\\\"\").('\"':).map(Data.Char.toUpper).tail.dropWhile(/='=')).lines"
汗。本来想试试的。结果要下载50+MB,安装后500+MB
正在解决依赖关系...
正在查找内部冲突...

目标 (1): ghc-7.0.3-2

全部下载大小: 59.78 MB
全部安装大小: 526.23 MB

进行安装吗? [Y/n] n
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
MaskRay
帖子: 61
注册时间: 2010-04-29 22:00
系统: Gentoo Linux ~amd64
联系:

Re: 求脚本!!!!

#24

帖子 MaskRay » 2011-08-04 15:26

我就是我2 写了:
MaskRay 写了:Haskell

代码: 全选

ghc -e "interact\$concat.(\"ss=\":).Data.List.intersperse\",\".map((++\"\\\"\").('\"':).map(Data.Char.toUpper).tail.dropWhile(/='=')).lines"
汗。本来想试试的。结果要下载50+MB,安装后500+MB
正在解决依赖关系...
正在查找内部冲突...

目标 (1): ghc-7.0.3-2

全部下载大小: 59.78 MB
全部安装大小: 526.23 MB

进行安装吗? [Y/n] n
我的 Gentoo 系统中 qsize 最大的包了,比 libreoffice-bin 大。

前面人都把 shell utilities 用烂了,不换花样不好意思拿上来

Haskell 语法没那么活,语言层面没集成那么多功能(集成多不一定是褒义,像 Perl),默认可用的函数的不多,所以写 one liner 可能不合适,但代码行数上去了优势就明显了。
killer2001
帖子: 16
注册时间: 2010-07-09 20:28

Re: 求脚本!!!!

#25

帖子 killer2001 » 2011-08-04 16:29

我就是我2 写了:
y3=compt_c[uidt5100@home]$ data=$(grep "compt" a.dat | awk -F "=" '{print "\"" $2 "\"," } A-Z | tr -d '\n' | sed 's/,$//')
命令没有输错先,希望不是文字错误。
复制,保存为脚本test.sh。 :em20
set 是调试用的。
[bash]
#!/bin/bash
set -x
DATA=$(grep "compt" a.dat | awk -F "=" '{print "\"" $2 "\"," }' | tr a-z A-Z | tr -d '\n' | sed 's/,$//')
echo "ss=$DATA"
set +x
exit 0
[/bash]
运行结果
./test.sh
++ grep compt a.dat
++ tr a-z A-Z
++ awk -F = '{print "\"" $2 "\"," }'
++ tr -d '\n'
++ sed 's/,$//'
+ DATA='"COMPT_A","COMPT_B","COMPT_C"'
+ echo 'ss="COMPT_A","COMPT_B","COMPT_C"'
ss="COMPT_A","COMPT_B","COMPT_C"
+ set +x

和你的结果不一样。第一次运行脚本中第一行是空行,在vi中去掉了。

[uidt5100@home]$ ./test.sh
bash: ./test.sh: Permission denied
[uidt5100@home]$ chmod 755 test.sh
[uidt5100@home]$ vi test.sh
[uidt5100@home]$ ./test.sh
++ tr -d '\n'
++ grep compt a.dat
++ awk -F = '{print "\"" $2 "\"," }'
++ sed 's/,$//'
++ tr a-z A-Z
","COMPT_C"'PT_A
","COMPT_C"'COMPT_A
","COMPT_C"
+ set +x
[uidt5100@home]$ cat test.sh
#!/bin/bash
set -x
DATA=$(grep "compt" a.dat | awk -F "=" '{print "\"" $2 "\"," }' | tr a-z A-Z | tr -d '\n' | sed 's/,$//')
echo "ss=$DATA"
set +x
exit 0
[uidt5100@home]$
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

Re: 求脚本!!!!

#26

帖子 我就是我2 » 2011-08-04 16:58

我不知道是什么导致这种差异
++ tr -d '\n'
位置乱了。跑到最前面去了。 :em20
直接shell中分开输入,以管道为间隔,若前一个输出正确则继续一个。

代码: 全选

grep "compt" a.dat 
grep "compt" a.dat | awk -F "=" '{print "\"" $2 "\"," }'
grep "compt" a.dat | awk -F "=" '{print "\"" $2 "\"," }' | tr a-z A-Z 
grep "compt" a.dat | awk -F "=" '{print "\"" $2 "\"," }' | tr a-z A-Z | tr -d '\n'
grep "compt" a.dat | awk -F "=" '{print "\"" $2 "\"," }' | tr a-z A-Z | tr -d '\n' | sed 's/,$//'
或者新建一个用户试试。我实在搞不懂了。
前面神说了,调试。。。 :em20
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 求脚本!!!!

#27

帖子 fnan » 2011-08-04 21:14

killer2001 写了:
fnan 写了:用变量:
ss='';for i in `tr a-z A-Z <a.dat|cut -d= -f2`;do ss=${ss:+$ss'","'}$i;done;echo 'ss="'$ss'"'

大哥,我这里不行啊?
[uidt5100@home]$ ss='';for i in `tr a-z A-Z <a.dat|cut -d= -f2`;do ss=${ss:+$ss'","'}$i;done;echo 'ss="'$ss'"'
","COMPT_C","
[uidt5100@home]$
你的不是bash?

代码: 全选

kose5@kose5-Aspire-4552:~$ ss='';for i in `tr a-z A-Z <a.dat|cut -d= -f2`;do ss=${ss:+$ss'","'}$i;done;echo 'ss="'$ss'"'
ss="COMPT_A","COMPT_B","COMPT_C","COMPT_D","COMPT_E"
kose5@kose5-Aspire-4552:~$ 
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 求脚本!!!!

#28

帖子 fnan » 2011-08-04 21:30

十二楼的可以用啊:
kose5@kose5-Aspire-4552:~$ data=$(grep "compt" a.dat | awk -F "=" '{print "\"" $2 "\"," }' | tr a-z A-Z | tr -d '\n' | sed 's/,$//')
kose5@kose5-Aspire-4552:~$ echo "ss=$data"
ss="COMPT_A","COMPT_B","COMPT_C","COMPT_D","COMPT_E"
kose5@kose5-Aspire-4552:~$
虽然awk不用另开那么多进程:
awk -F= '{if (f == "") printf "ss=\"";else printf f "\",\"";f=toupper($2)} END{print toupper($2) "\""}' a.dat
(lz的shell是什么shell?)
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 求脚本!!!!

#29

帖子 fnan » 2011-08-04 21:49

killer2001 写了:
fnan 写了:lz的方法也可以啊,不过有些细节不易想到,先不写出来。
按我写的那个,在for里每次$each都没问题,但是赋值给ss的时候就不行了,覆盖了原来的ss?

[uidt5100@home]$ ss=""
[uidt5100@home]$ for each in `cat a.dat |grep "compt" | cut -d"=" -f2 |tr a-z A-Z` #cat 和 grep 多余的,难道文本里另有东西?
( for each in ` cut -d"=" -f2 <a.dat|tr a-z A-Z` )
> do
> echo $each
> ss=\"$ss\",\"$each\" #但是赋值给ss的时候就不行了,覆盖了原来的ss?是的。#细心看看,不会覆盖原ss的,至多"字符会重复。到底是什么shell?
( [ $ss ] && ss="$ss\",\"$i" || ss="ss=\"$i" )
> done
[uidt5100@home]$ echo $ss\"
修改结果:
kose5@kose5-Aspire-4552:~$ ss='';for i in `tr a-z A-Z <a.dat|cut -d= -f2`;do [ $ss ] && ss="$ss\",\"$i" || ss="ss=\"$i";done;echo $ss\"
ss="COMPT_A","COMPT_B","COMPT_C","COMPT_D","COMPT_E"
kose5@kose5-Aspire-4552:~$
上次由 fnan 在 2011-08-05 0:47,总共编辑 1 次。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

Re: 求脚本!!!!

#30

帖子 我就是我2 » 2011-08-04 23:59

fnan 写了:十二楼的可以用啊:
kose5@kose5-Aspire-4552:~$ data=$(grep "compt" a.dat | awk -F "=" '{print "\"" $2 "\"," }' | tr a-z A-Z | tr -d '\n' | sed 's/,$//')
kose5@kose5-Aspire-4552:~$ echo "ss=$data"
ss="COMPT_A","COMPT_B","COMPT_C","COMPT_D","COMPT_E"
kose5@kose5-Aspire-4552:~$
虽然awk不用另开那么多进程:
awk -F= '{if (f == "") printf "ss=\"";else printf f "\",\"";f=toupper($2)} END{print toupper($2) "\""}' a.dat
(lz的shell是什么shell?)
我不懂awk的高级用法,我是shell初学者。
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
回复