shell学习笔记

来源:互联网 发布:linux gcc安装 编辑:程序博客网 时间:2024/06/05 11:22
=====================================================
1.shell 命令的执行过程:
1>shell控制键盘和屏幕
2>扑捉用户输入
3>fork一个process
4>执行系统调用exec()执行用户输入的命令
5>执行完返回到shell

=====================================================
2.shell脚本tmp.sh的执行方法:

1>./tmp.sh
2>bash/sh tmp.sh
3>source tmp.sh
4>. tmp.sh
          5>eval '. tmp.sh'
          6>(./tmp.sh) //exculted in sub shell
          6>{./tmp.sh} //exculted in current shell

=====================================================
3. sed 替换文本中第一个空行为xxoo
file:
a

b

c
cat file | sed -r '1, /^$/s/^$/xxoo/'
将上述文本的最后一个空行替换成xxoo
cat file | sed -r ':a; N; $!ba; s/(.*\n)(\n.*)/\1xxoo\2/'

=====================================================
4.正则随记
\w 和[a-zA-Z0-9_]等价
\W 和[^a-zA-Z0-9_]等价
\s 和[\f\n\r\t\v]等价
\S 和[^\f\n\r\t\v]等价

POSIX字符类:

类名

意义

[:upper:]表示大写字母[A~Z][:lower:]表示小写字母[a~z]

[:digit:]

表示阿拉伯数字[0~9]

[:alnum:]

表示大小写字母和阿拉伯数字[A~Za~z0~9]

[:space:]

表示任何产生空白的字符,包括空格或Tab键等

[:alpha:]

表示大小写字母[A~Za~z]

[:cntrl:]

表示键盘的控制按键,包括Tab、Del等按键[:graph:]表示除了空格符(空格键与Tab键)外的其他所有按键[:print:]表示任何可以被打印出来的字符[:xdigit:]表示十六进制数字[0~9A~Za~z][:blank:]表示空格键与Tab键[:punct:]表示标点符号,包括:" ' ? ! ; : # $... 


4.查看一个字串的ASCii码值
echo -n "12" | od -An -t x1
 31 32

=====================================================
5.shell中,将其他进制数转换成10进制数:

#将2进制的11111转换成10进制为31
echo $((2#11111))
31

#将16进制数17,转换成10进制后,为23
 echo $((16#17))
23

#将23进制数24,转换成10进制后,为50
echo $((23#24))
50

=====================================================
6.将文件A中的数据的前两列提取出来作为文件名,并将对应的行存储到文件中
这个问题的需求是这样:cat 22
'A001',10,2,3,4
'A001',10,2,3,5
'A001',10,2,3,6
'A001',20,2,3,4
'A002',10,2,3,4
'A002',20,2,3,4
'A003',10,2,3,4
'A003',40,2,3,4
将前两列组合成文件名(如:A001_10.cvs),并生成这个文件A001_10.cvs,并且把对应的行存储到文件中,
那么这个文件应包含如下几列:
'A001',10,2,3,4
'A001',10,2,3,5
'A001',10,2,3,6

思路1:cat 22 | awk -F [,\'] '{str=$2"_"$4; print $0 >> str".cvs"}'
思路2:awk -F"[',]" '{a[$2"_"$4]=a[$2"_"$4]?a[$2"_"$4]"\n"$0:$0}END{for(i in a)print a[i] > i".csv"}' 22
对于思路2的解释
使用了数组实现,数组名是a,-F定义单引号和逗号为分隔符,
数组使用第二个域下划线和第四个域为索引建立数组
那么对于22这个文件,组数只有这么几个索引:
A001_10
A001_20
A002_10
A002_20
A003_10
A003_40
理解了这个,就能明白这部分代码了
a[$2"_"$4]=a[$2"_"$4]?a[$2"_"$4]"\n"$0:$0
awk语句一次读入每一行,这部分代码先判断索引$2"_"$4对应的数组a中有没元素,
如果不为空,则在这个元素后面添加换行符以及当前行$0
如果为空,则直接添加当前行为其元素

=====================================================
7.awk中特殊的分隔符
echo "aaa  bbb|ccc-ddd\eee" | awk -F ' +|-|\\||\\\\' '{print $1,"xxx ",$2,"ooo "$3,"xxx "$4,"ooo " $5}' 
aaa xxx  bbb ooo ccc xxx ddd ooo eee
定义分隔符时,改成双引号,会报错
 echo "aaa  bbb|ccc-ddd\eee" | awk -F " +|-|\\||\\\\" '{print $1,"xxx ",$2,"ooo "$3,"xxx "$4,"ooo " $5}'  
awk: warning: escape sequence `\|' treated as plain `|'
aaa xxx  bbb|ccc ooo ddd\eee xxx  ooo 
这么修改下,就OK
 echo "aaa  bbb|ccc-ddd\eee" | awk -F " +|-|\\\\||\\\\" '{print $1,"xxx ",$2,"ooo "$3,"xxx "$4,"ooo " $5}'
aaa xxx  bbb ooo ccc xxx ddd\eee ooo
但是明显,"\"没有被当成分隔符来处理
再修改下:
 echo "aaa  bbb|ccc-ddd\eee" | awk -F " +|-|\\\\||\\\\\\" '{print $1,"xxx ",$2,"ooo "$3,"xxx "$4,"ooo " $5}'
aaa xxx  bbb ooo ccc xxx ddd ooo eee
OK了,很神奇,但是有很疑惑...期待达人解释下....

8. shell命令千千万万,有时会犯糊涂,只能记起命令的几个字符,可以通过如下方式检索:
compgen -ac ifc
ifcfg
ifconfig
-->列举以ifc开头的命令

compgen -ac | grep ifc
ifcfg
ifconfig
pifconfig
-->列举包含ifc字符串的命令

=====================================================
9.bash中的here strings
Here Strings
------------------
here string 可以被认为是here document的一种定制形式. 除了COMMAND <<<$WORD 就什么都
没有了, $WORD将被扩展并且被送入COMMAND的stdin中.
Example 17-13 在一个文件的开头添加文本
################################Start Script#######################################
 1 #!/bin/bash
 2 # prepend.sh: 在文件的开头添加文本.
 3 #
 4 #  Kenny Stauffer所捐助的脚本例子,
 5 #+ 被本文作者作了少量的修改.
 6 
 7 
 8 E_NOSUCHFILE=65
 9 
10 read -p "File: " file   # 'read'命令的 -p 参数显示提示符.
11 if [ ! -e "$file" ]
12 then   # 如果没有这个文件那就进来.
13   echo "File $file not found."
14   exit $E_NOSUCHFILE
15 fi
16 
17 read -p "Title: " title
18 cat - $file <<<$title > $file.new
19 
20 echo "Modified file is $file.new"
21 
22 exit 0
23 
24 # 下边是'man bash'中的一段:
25 # Here Strings
26 #  here document的一种变形,形式如下:
27 # 
28 #   <<<word
29 # 
30 #   word被扩展并且提供到command的标准输入中.
################################End Script#########################################
练习: 找出here string的其他用法.
http://blog.chinaunix.net/uid-20498156-id-1663572.html

10.格式化输入
node001
node002
node003
.....
node128

printf "node%03d\n" {1..128}

=====================================================
删除不可见字符
col -b < file > newfile












0 0
原创粉丝点击