我用IPD玩QQ麻将技巧老是出现突然中间一个白色的圈 然后就无法操作了 然后托管了 也没法取消

银河足球博彩公司
直接玩欢乐斗地主棋牌
利澳博彩娱乐城
每天的业绩简直令人不敢相信可她眼神里面却充满了清纯与烂漫
这陀螺立刻粉碎杜飞拿它来与你交换
直奔前台刚则易折
别等了严芳按照王远山的指引
就算是神仙也救不活了而李云东是一个侠肝义胆
我爱你亚洲妹
蓝盾国际娱乐城好玩吗
抱歉:我们对来路少、质量差链接已下,恕不另行通知。
友情链接| 合作伙伴Linux下多行合并成一行,中间加分隔符 | Linux |
_数据库_运维_开发_IT学习_无忧IT学习网
一起学习!一起进步!
Linux下多行合并成一行,中间加分隔符
浏览: 114 views
将某个目录下的文件合并成一行,中间用冒号(:)作为分隔符
ls lib | sed 's@^@lib/@g' | paste -s -d &:&
ls lib | ...
将某个目录下的文件合并成一行,中间用冒号(:)作为分隔符
ls lib | sed 's@^@lib/@g' | paste -s -d &:&
ls lib | sed 's@^@lib/@g' | tr &\n& &:& | sed 's@:$@@'
ls lib | sed 's@^@lib/@g' | xargs | sed 's/ /:/g'
ls lib | sed 's@^@lib/@g' | awk &{if(NR%`ls lib | sed 's@^@lib/@g' | wc -l`){ORS=\&:\&}else{ORS=\&\n\&};}&
ls lib | sed 's@^@lib/@g' | perl -pe 's/\n/:/;' | sed 's@:$@@'
#!/usr/bin/env python
#coding:utf8
def dirList(dir):
filelist = os.listdir(dir)
allfile=[]
for filename in filelist:
allfile.append(dir+'/'+filename)
return allfile
allfile=dirList('lib')
pathjar=':'.join(allfile)
print pathjar
的基本组成部分:
^&&&&&& 行起始标记
$&&&&& 行尾标记
.&&&&&& 匹配任意一个字符
[]&&&&& 匹配包含在[字符]之中的任意一个字符
[^]&&&& 匹配除[^字符]之外的任意一个字符
[-]&&&& 匹配[]中指定范围内的任意一个字符
?&&&&& 匹配之前的项1次或0次
+&&&&& 匹配之前的项1次或多次
*&&&&&& 匹配之前的项0次或多次
()&&&&& 创建一个用于匹配的子串,例如:ma(tri)?匹配max或maxtrix
{n}&&& 匹配之前的项n次
{n,}&& 之前的项至少需要匹配n次
{n,m} 指定之前的项所必需匹配的最小次数和最大次数
|&&&&&&& 匹配|两边的任意一项
\&&&&&&& 转义符可以将上面介绍的特殊字符进行转义
POSIX字符类是一个形如[:...:]的特殊元序列(meta sequence),它可以用于匹配特定的字符范围。
POSIX字符表如下:
[:alnum:] 字符与数字字符
[:alpha:] 字母字符(包括大写字母与小写字母)
[:blank:] 空格与制表符
[:digit:] 数字字符
[:lower:] 小写字母
[:upper:] 大写字母
[:punct:] 标点符号
[:space:] 包括换行符、回车等在内的所有空白字符
元字符是一种风格的,只有一部分文本处理工具支持它,并不是所有的工具支持它
\b 单词边界
\B 非单词边界
\d 单个数字字符
\D 单个非数字字符
\w 单个单词字符(字母、数字与_)
\W 单个非单词字符
\s 单个空白字符
\S 单个非空白字符
grep match_pattern filename或者grep &match_pattern& filename
this is the line containing match_pattern #命令会返回包含给定match_pattern的文本行
[root@server1 test]# echo -e &this is a word\nnext line& | grep word &color=auto
this is a word
grep命令通常将match_pattern视为通配符。如果要使用正则表达式,需要添加-E(extended)使用扩展正则表达式,也可以使用默认允许正则表达式的grep命令&egrep
[root@server1 test]# echo -e &www.myonlinemanual.net 4&P | grep -E &[a-z]+&
www.myonlinemanual.net 43243
[root@server1 test]# echo -e &www.myonlinemanual.net 4&P | egrep &[a-z]+&
www.myonlinemanual.net 43243
#选项-o只输出文本中匹配到的文本部分
[root@server1 test]# echo -e &www.myonlinemanual.net 4&P | egrep -o &[a-z]+&
#选项-v(invert)将匹配结果进行反转
[root@server1 test]# echo -e &www.myonlinemanual.net 4&P | egrep -v &[a-z]+&
#-c统计匹配行的数量,并不是匹配的次数
[root@server1 test]# echo -e &www.myonlinemanual.net 4\n3333&P | egrep -vc &[a-z]+&
#-n打印出包含匹配字符串的行号
[root@server1 test]# echo -e &www.myonlinemanual.net 4\n3333&P | egrep -vn &[a-z]+&
#-b打印样式匹配所位于的字符或字节偏移,一行中字符串的字符偏移是从该行的第一个字符开始计算,起始值是0
[root@server1 test]# echo -e &www.myonlinemanual.net 4\n3333&P | egrep -vb &[a-z]+&
#-l搜索多个文件并找出匹配文本位于哪一个文件中 -l相反选项-L,它会返回一个不匹配的文件列表
[root@server1 test]# grep -l line2 *
version1.txt
version2.txt
version.patch
[root@server1 test]# grep -L line2 *
filestat.sh
remove_duplicates.sh
test_copy1
test_copy2
#-R递归搜索文件
[root@server1 test]# grep -Rn &text& .
#-i忽略样式中的大小写
[root@server1 test]# echo www.myonlinemanual.net | grep -i eye
www.myonlinemanual.net
#-e匹配多个样式中的一个
[root@server1 test]# echo www.myonlinemanual.net | grep -ie linx -e com
www.myonlinemanual.net
#-f与-e选项以后,-f在样式文件中逐行写下匹配的样式
[root@server1 test]# cat pat_file
[root@server1 test]# echo &hello this is cool& | grep -f pat_file
hello this is cool
#在grep搜索中包含或排除文件
只在目录中递归搜索所有的.c和.cpp文件
[root@server1 test]# grep &main()& /usr -r &include *.{c,cpp}
/usr/src/kernels/2.6.18-194.el5PAE-i686/scripts/kconfig/gconf.c: gtk_main();
在搜索中排除所有的README文件
[root@server1 test]# grep &main()& . -r &exclude &README&
如果需要排除目录,可以使用&exclude-dir选项
如果需要从文件中读取所需排除的文件列表,使用&exclude-from FILE
使用0值字节后缀的grep与xargs
[root@server1 test]# echo test & file1
[root@server1 test]# echo cool & file2
[root@server1 test]# echo test & file3
[root@server1 test]# grep &test& file* -lZ | xargs -0 rm
grep的静默输出
-q(quiet mode)
[root@server1 test]# cat file2
[root@server1 test]# grep -q &co& file2 ;echo $?
[root@server1 test]# grep -q &cookk& file2 ;echo $?
打印出匹配文本的之前行或之后行
[root@server1 test]# seq 10 | grep 5 -A 3
[root@server1 test]# seq 10 | grep 5 -B 3
[root@server1 test]# seq 10 | grep 5 -C 2
[root@server1 test]# cat data.txt
No Name Mark Percent
1 Sarath 45 90
2 Alex 49 98
3 Anu 45 90
[root@server1 test]# cut -f 1,4 data.txt
No Percent
#-complement选项对提前的字段进行补集运算
[root@server1 test]# cut -f3 &complement data.txt
No Name Percent
1 Sarath 90
要指定字段的定界符,使用-d选项
[root@server1 test]# cat data1.txt
No;NMPercent
[root@server1 test]# cut -f2,4 -d&;& data1.txt
-b表示字节;-c表示字符;-f表示定义字段
[root@server1 test]# cut -c-3 data1.txt
[root@server1 test]# cut -c2-4 data1.txt
4. 统计特定文件中的词频
[root@server1 test]# cat word_freq.sh
#!/bin/bash
if [ $# -ne 1 ];
echo &Usage: $0 filename&;
filename=$1
egrep -o &\b[[:alpha:]]+\b& $filename | awk &{ count[$0]++ }END{ printf(&%-14s%s\n&,&Word&,&Count&);
for(ind in count)
{ printf(&%-14s%d\n&,ind,count[ind]);}
egrep -o &\b[[:alpha:]]+\b& $filename用来只输出单词。用-o选项打印由换行符分隔的匹配字符序列。
\b是单词边界标记符。[:alpha:]是表示字母的字符类。
[root@server1 test]# echo </ linuxeyelinuxeyelinuxeye | sed &s/linuxeye/LINUXEYE/&
linuxeyelinuxeyelinuxeye
[root@server1 test]#
linuxeyelinuxeyelinuxeye | sed &s/linuxeye/LINUXEYE/g&
LINUXEYELINUXEYELINUXEYE
[root@server1 test]#
linuxeyelinuxeyelinuxeye | sed &s/linuxeye/LINUXEYE/2g&
LINUXEYELINUXEYELINUXEYE
[root@server1 test]#
linuxeyelinuxeyelinuxeye | sed &s/linuxeye/LINUXEYE/4g&
linuxeyelinuxeyeLINUXEYE
[root@server1 test]#
linuxeyelinuxeyelinuxeye | sed &s/linuxeye/LINUXEYE/2&
LINUXEYElinuxeyelinuxeye
[root@server1 test]#
linuxeyelinuxeyelinuxeye | sed &s/linuxeye/LINUXEYE/4&
linuxeyelinuxeyeLINUXEYE
不带参数g会将每一行中第一处符合样式的内容替换掉;带参数g则替换所有内容;数字表示从N处匹配开始替换
参考:/linux/104.html
/linux/105.html
# echo -e &line1 f2 f3\nline2 f4 f5\nline3 f6 f7&P | awk &{ print &line
no: & NR &,No of fields:& NF &,$0=&$0 & ,$1=&$1 & ,$2=&$2}&
line no: 1,No of fields:3,$0=line1 f2 f3 ,$1=line1 ,$2=f2
line no: 2,No of fields:3,$0=line2 f4 f5 ,$1=line2 ,$2=f4
line no: 3,No of fields:3,$0=line3 f6 f7 ,$1=line3 ,$2=f6
# seq 5 | awk &BEGIN{ sum=0; print &Summation:& }{ print $1&P+&;sum+=$1 } END { print &==&; print sum }&
Summation:
# VAR=1000
# echo | awk -v VARIABLE=$VAR &{ print VARIABLE }&
# var1=1; var2=2
# echo | awk &{print v1,v2}& v1=$var1 v2=$var2
#getline读取行
# seq 5 | awk &BEGIN {print &test:&$0}{print $0}&
#用样式对awk出来的行进行过滤
awk &NR & 5& #行号小于5的行
awk &NR==2,NR==4& #行号在2到4之间的行
awk &/linuxeye/& #包含样式linuxeye的行
awk &!/linuxeye/& #不包含样式linuxeye的行
#设置字段定界符
# awk -F: &{print $NF}& /etc/passwd
awk &BEGIN { FS=&:& } {print $NF}& /etc/passwd
#从awk中读取命令输出
# echo | awk &{ &grep root /etc/passwd& | print cmdout }&
7. 压缩或解压缩Script
cat sample.js | tr -d &\n\t& | tr -s & & | sed &s:/\*.*\*/::g& | sed &s/ \?\([{}();,:]\) \?/\1/g&
8. 按列合并文件
[root@server1 test]# paste paste1 paste2
2 linuxeye
5 opensource
[root@server1 test]# cat paste1
[root@server1 test]# cat paste2
opensource
[root@server1 test]# paste paste1 paste2
2 linuxeye
5 opensource
#默认的定界符是制表符,也可以用-d明确指定定界符,如下:
[root@server1 test]# paste paste1 paste2 -d &:&
2:linuxeye
5:opensource
9. 用脚本验证回文字符串
sed命令能够记住之前匹配的子样式(sub pattern)。这被称为反向引用。我们可以借助这项功能解决回文问题。
# cat match_palindrome.sh
#!/bin/bash
if [ $# -ne 2 ];
echo &Usage: $0 filename string_length&
filename=$1
basepattern=&/^\(.\)&
count=$(( $2 / 2 ))
for((i=1;i&$i++)) do basepattern=$basepattern&\(.\)&; done if [
$(( $2 % 2 )) -ne 0 ]; then basepattern=$basepattern&.&#39;; fi
for((count&0;count&))
basepattern=$basepattern&\&&$count&;
basepattern=$basepattern&$/p&
sed -n &$basepattern& $filename
rev逆向打印出每一行内容
| rev | tr & & &\n& | tac | tr &\n& & & | rev
10. awk实现head、tail和tac
head /etc/passwd awk实现:awk &NR&=10& /etc/passwd
tail /etc/passwd awk实现:awk &{ buffer[NR%10]=$0;} END {
for(i=1;i&11;i++) { print buffer[i%10]}}& /etc/passwd tac /etc/passwd
awk实现:awk &{ buffer[NR] = $0; } END { for(i=NR;i&0;i&) { print
buffer[i] } }& /etc/passwd
11. 文本切片与参数操作
# var=&This is a line of text&
# echo ${var/line/REPLACED}
This is a REPLACED of text
# string=http://www.myonlinemanual.net
# echo ${string:7} #打印第7个字符之后的内容
www.myonlinemanual.net
# echo ${string:11:8} #从第11个字符开始,打印8个字符
其实字符的索引从0开始计数。我们也可以从后向前计数,将最后一个字符索引计为-1.但如果使用负数作为索引值得话,必须将负数放入括号内,例如(-1)就是最后一个字符的索引
# echo ${string:(-12):8}
comm命令可用于两个文件直接的比较。它有很多不错的选项可用来调整输出,以便我们执行交集、求差(difference)以及差集操作
交集:打印出两个文件所共有的行
求差:打印出知道文件所包含的且不相同的那些行
差集:打印出包含在文件A中,但不包含在其他指定文件中的那些行
需要注意的是comm必须使用排过序的文件作为输入
[root@server1 linuxeye]# cat A.txt
[root@server1 linuxeye]# cat B.txt
[root@server1 linuxeye]# sort A.txt -o A.txt
[root@server1 linuxeye]# sort B.txt -o B.txt
[root@server1 linuxeye]# comm A.txt B.txt
输出的第一列包含只在A.txt中出现的行,第二列包含只在B.txt中出现的行,第三列包含A.txt和B.txt中都出现的行
[root@server1 linuxeye]# comm A.txt B.txt -1 -2& #打印两个文件的交集,即删除第一列和第二列
[root@server1 linuxeye]# comm A.txt B.txt -3&&&& #打印两个文件中不相同的行,即删除第三列
[root@server1 linuxeye]# comm A.txt B.txt -3 | sed &s/^\t//&
[root@server1 linuxeye]# comm A.txt B.txt -23&&&& #A.txt的差集
[root@server1 linuxeye]# comm A.txt B.txt -13&&&& #B.txt的差集
2. 查找并删除重复文件
3. 列举文件类型统计信息脚本
4. 环回文件与挂载
5. 生成ISO文件及混合ISO
mkisofs #用于创建ISO文件系统
mkisofs -V &label& -o test.iso ./test& #将整个目录的内容写入ISO文件中 -V指定ISO文件的卷标、-o指定ISO文件的路径
cdrecord& #可以将ISO文件刻录入CD ROM或DVD ROM
cdrecord -v dev=/dev/cdrom image.iso
-speed指定刻录速度
cdrecord -v dev=/dev/cdrom image.iso -speed 8 #参数8指定其刻录速度为8x
刻录CD ROM时也可以采用多区段(miltisession)方式,这样能在一张光盘上分多次刻录数据,参数-multi选项
cdrecord -v dev=/dev/cdrom image.iso -multi
eject& #弹出光驱托管
eject& #合上光驱托盘
6. 查找文件差异并进行修补
[root@server1 test]# cat version1.txt
this is the original text
happy hacking!
[root@server1 test]# cat version2.txt
this is the original text
happy hacking!
GNU is not UNIX
[root@server1 test]# diff version1.txt version2.txt
& GNU is not UNIX
[root@server1 test]# diff -u version1.txt version2.txt
& version1.txt&&&&&&&
15:10:27. +0800
+++ version2.txt&&&&&&&
15:11:00. +0800
@@ -1,5 +1,5 @@
this is the original text
happy hacking!
+GNU is not UNIX
-u用于生成一体化输出。因为一体化输出的可读性更好。+起始的是新加入的行,-起始的是删除的行
[root@server1 test]# diff -u version1.txt version2.txt & version.patch
现在可以用patch命令修改应用于任意一个文件。当应用于version1.txt时,我们就可以得到version2.txt;而当应用于version2.txt时,就可以得到version1.txt
[root@server1 test]# patch -p1 version1.txt & version.patch
missing header for unified diff at line 3 of patch
patching file version1.txt
[root@server1 test]# cat version1.txt
this is the original text
happy hacking!
GNU is not UNIX
下面的命令可以撤销做出的修改,使用-R选项,则不会提示用户y/n:
[root@server1 test]# patch -p1 version1.txt & version.patch
missing header for unified diff at line 3 of patch
patching file version1.txt
Reversed (or previously applied) patch detected!& Assume -R? [n] y
[root@server1 test]# cat version1.txt
this is the original text
happy hacking!
# diff -Naur directory1& directory2
选项含义:
-N:将所有缺失的文件视为空文件
-a:将所有的文件视为文本文件
-u:生成一体化输出
-r:遍历目录下的所有文件
7. head tail
head命令总是读取输入文件的头部
打印前10行(不带参数默认10行):
[root@server1 test]# head /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
:x:8:12::/var/spool/:/sbin/nologin
news:x:9:13:news:/etc/news:
指定打印前5行:
[root@server1 test]# head -n 5 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
打印除最后N行之外的所有行:
[root@server1 test]# head -n -30 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
打印最后10行(不带参数默认10行):
[root@server1 test]# tail /etc/passwd
xfs:x:43:43:X Font Server:/etc/X11/fs:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x::Anonymous NFS User:/var/lib/nfs:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
avahi-autoipd:x:100:104:avahi-autoipd:/var/lib/avahi-autoipd:/sbin/nologin
sabayon:x:86:86:Sabayon user:/home/sabayon:/sbin/nologin
:x:500:500::/home/:/sbin/nologin
www:x:501:501::/home/www:/sbin/nologin
tech:x:502:502::/home/tech:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
打印最后5行:
[root@server1 test]# tail -n 5 /etc/passwd
sabayon:x:86:86:Sabayon user:/home/sabayon:/sbin/nologin
:x:500:500::/home/:/sbin/nologin
www:x:501:501::/home/www:/sbin/nologin
tech:x:502:502::/home/tech:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
打印除了前N行之外所有的行:
tail -n +(n+1)
打印除前30行之外的所有行,N+1=31:
[root@server1 test]# tail -n +31 /etc/passwd
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
avahi-autoipd:x:100:104:avahi-autoipd:/var/lib/avahi-autoipd:/sbin/nologin
sabayon:x:86:86:Sabayon user:/home/sabayon:/sbin/nologin
:x:500:500::/home/:/sbin/nologin
www:x:501:501::/home/www:/sbin/nologin
tech:x:502:502::/home/tech:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
-f(&follow)
8. 只列出目录的其他方法
# ls -d */
# ls -F | grep &/$&
# ls -l | grep &^d&
# find . -type d -maxdepth 1 -print
9. pushd、popd快速定位
使用pushd、popd的时候,就可以无视cd命令了
压入并切换路径,使用:
[root@server1 ~]# pushd /var/log
/var/log ~
[root@server1 log]# pushd /usr/src
/usr/src /var/log ~
[root@server1 src]# pushd /etc
/etc /usr/src /var/log ~
[root@server1 etc]# pushd /dev
/dev /etc /usr/src /var/log ~
[root@server1 dev]# dirs
/dev /etc /usr/src /var/log ~
0&&& 1&&&&& 2&&&&&&& 3&&& 4
当你想切换到列表中任意一个路径时,将每条路径从0到n进行编号,然后使用你希望切换到的路径编号,如下:
[root@server1 dev]# pushd +3
/var/log ~ /dev /etc /usr/src
[root@server1 log]# pwd
pushd总是将路径添加到栈,如果要从栈中删除路径,可以使用popd
移除最近压入栈的路径并切换到下一个目录:
[root@server1 log]# popd
~ /dev /etc /usr/src
[root@server1 ~]#
[root@server1 ~]# popd +3
~ /dev /etc
# popd +no可以从列表中移除特定的路径,no是从左到右,从0到n开始计数的
10. 统计文本的行数、单词数和字符数
wc(Word Count单词统计)
[root@server1 test]# wc -l version.patch #统计行数
9 version.patch
[root@server1 test]# wc -w version.patch #统计单词书
28 version.patch
[root@server1 test]# wc -c version.patch #统计字符数
203 version.patch
[root@server1 test]# echo -n 1234 | wc -c # -n用于避免echo添加额外的换行符
[root@server1 test]# wc version.patch&&& #不使用任何执行wc会打印行数、单词数和字符数,彼此之间用制表符分隔
9& 28 203 version.patch
[root@server1 test]# wc -L version.patch& #打印最长行的程度
59 version.patch
11. 打印目录树tree
只重点标记出匹配某种样式的文件
[root@server1 test]# tree ./ -P &*.txt& #用通配符描述样式
|& version1.txt
`& version2.txt
0 directories, 2 files
只重点标记出除符合某种样式之外ide那些文件
[root@server1 test]# tree ./ -I &*.txt&
|& filestat.sh
|& remove_duplicates.sh
|& test_copy1
|& test_copy2
|& version.patch
`& version1.txt.orig
0 directories, 8 files
tree命令可以生成html输出。如用下面的命令可以创建一个包含目录树输出的html文件
[root@server1 test]# tree ./ -H http://localhost -o out.html
1. cat (concatenate)
#标准输入和输入文件的内容拼接在一起
echo &Text through stdin& | cat & file.txt
压缩空白行
#将多个空行压缩成单个空格行,如下:
[root@server1 ~]# cat multi_blanks.txt
[root@server1 ~]# cat -s multi_blanks.txt
#用tr移除空白行
[root@server1 ~]# cat multi_blanks.txt | tr -s &\n&
制表符显示为^|
单从视觉上很难将制表符同连续的空格区分开。而在用之类的语言编写程序时,将将制表符和空格用于代码缩进,具有特殊含义,并进行区别对待。因
此,若在应该使用空格的地方误用了制表符的话,就会产生缩进错误。仅仅在文本编辑器中进行查看是很难发现这种错误的。cat有这个特性,可以将制表符重点
标记出来。该特性对排除缩进错误非常有用。用cat命令的-T选项能够将制表符标记成^|。例如:
[root@server1 test]# cat file.py
def function();
[root@server1 test]# cat -T file.py
def function();
^I^Inext = 6
^Ithird = 7
2. 录制与回放终端会话
[root@server1 test]# script -t 2& timing.log -a output.session
Script started, file is output.session
[root@server1 test]# ls
2& a1& a2& a3& file.py& ifs.sh& jd2.sh& jd.sh& multi_blanks.txt& output.session& set ff=unix& timing.log
[root@server1 test]# exit
Script done, file is output.session
两个文件被当做script命令的参数。其中一个文件timing.log用于时序信息,描述每一个命令在何时运行;另一个文件
output.session用于命令输出。-t选项用于将时序数据导入stderr。2&则用于将stderr重定向到
timing.log。
借助这两个文件:timing.log(时序信息)和output.session(存储命令输入信息),我们可以按照下面的方法回放命令执行过程:
[root@server1 test]# scriptreplay timing.log output.session& #按播放命令序列输出
script命令同样可以用于建立可在多个用户直接进行广播的视频会话。
打开两个终端,Terminal1和Terminal2
1)在Terminal1中输入以下命令:
[root@server1 test]# mkfifo scriptfifo
2)在Terminal2中输入以下命令:
[root@server1 test]# cat scriptfifo
3)在Terminal1中输入以下命令:
[root@server1 test]# script -f scriptfifo
Script started, file is scriptfifo
[root@server1 test]# commands
Terminal1就成为了广播员,而Terminal2则成为了听众,不管你在Terminal1中输入什么内容,它都会在Terminal2或者使用了cat scriptfifo命令的终端都会实时播放.
如果需要结束会话,输入exit并按回车键,退出
列出当前目录及子目录下所有的文件和文件夹
find bash_path -print
bash_path:查找路径
-print:使用&\n&作为定界符打印每一个匹配的文件名(路径)
-print0: 使用&\0&作为定界符打印每一个匹配的文件名(路径)
-name参数:根据文件名或正则表达式匹配搜索,-iname:忽略字母大小写
如果想匹配多个条件中的一个,可以采用or条件操作:
find . \(-name &*.txt& -o -iname &*.pdf& \) -print
-path:参数可以使用通配符来匹配文件路径或文件。-name总是用给定的文件名进行匹配,-path则将文件路径作为一个整体进行匹配。
-regex:和-path类似,只不过-regex是基于正则表达式来匹配文件路径的。正则表达式是通配符的高级形式。如:[a-z0-9]+@[a-z0-9]+.[a-z0-9]+(E地址形式,+指明在它之前的字符类中的字符可以出现一次或多次)
-iregex:忽略正则表达式的大小写
!:否定参数
-maxdepth:最大深度& #find命令向下的最大深度限制为1(-maxdepth 1)
-mindepth:最小深度
-maxdepth和-mindepth应该作为find的第3个参数出现。如果作为第4个或之后的参数,就可能会影响到find的效率,因为它不得不进
行一些不必要的检查。例如,如果-maxdepth作为第4个参数,-type作为第三个参数,find首先会找出符合-type的所有文件,然后在所有
匹配的文件中再找出符合指定深度的那些。但是如果反过来,目录深度作为第三个参数,-type作为第四个参数,那么find就能够在找到所有符合指定深度
的文件后,再检查这些文件的类型,这才是最有效的搜索顺序。
时间戳(timestamp)
-atime(访问时间):用户最近一次访问文件的时间。
-mtime(修改时间):文件内容最后一次被修改的时间。
-ctime(变化时间):文件元数据(metadata,例如权限或所有权)最后一次改变的时间。
-atime、-mtime、-ctime可作为find的时间参数。单位是天。这些整数值通常还带有-或+;-表示小于,+表示大于。
-amin(访问时间)、-mmin(修改时间)、-cmin(变化时间),单位分钟。
-newer:指定一个用于比较时间戳的参考文件,然后找出比参数文件更长的修改时间的所有文件。
find命令的时间戳操作出来选项对编写系统备份和很有帮助。
基于文件大小的搜索
find . -type f -size +2k #大于2k的文件
find . -type f -size -2k #小于2k的文件
find . -type f -size 2k& #等于2k的文件
除了k单位,还有其他文件大小单位b(块,512字节)、c(字节)、w(字,2字节)、k(千字节)、M(兆字节)、G(吉字节)
删除匹配的文件
-delete可以用来删除find查找到的匹配文件
例如:删除当前目录下所有的.swp文件:
find . -type f -name &*.swp& -delete
基于文件权限和所有权的匹配
find . -type f -perm 644 -print&& #打印当前目录下权限为644的文件
find . -type f -name &*.sh& -perm 755 -user root -print& #找出.sh结尾用户名为root权限为755的文件
find命令可以借助选项-exec与其他命令进行结合。
find . -type f -user root -name &*.swp& -exec rm -rf {} \;
{}是一个特殊的字符串,与-exec选项结合使用。对于每一个匹配的文件,{}会被替换成相应的文件名。
-exec能够同printf结合来生成有用的输出信息。例如:
# find . -type f -name &*.swp& -exec printf &Text file:%s\n& {} \;
Text file:./1.swp
Text file:./2.swp
Text file:./3.swp
find跳过特定的目录
在搜索目录并执行某些操作的时候,有时为了提高性能。需要跳过一些子目录。例如,程序员会在git所管理的开发源码树中查找特定的文件,源代码层级结构总
是会在每个子目录中包含一个.git目录(.git存储每个目录相关的版本控制信息)。因为与版本控制相关的目录对我们而言并没有什么用处,所以没必要去
搜索这些目录。
# find . \( -name &.git& -prune \) -o \( -type f -print \)
\( -name &.git& -prune \)的作用是用于进行排除,它指明了.git目录应该排除掉,而\( -type f -print \)指明了需要执行的动作。这些动作需要被放置在第二个语句块中
可以处理stdin标准输入并将其转换成特定命令的命令行参数。还可以将单行或多行文本输入转换成其他格式,例如单行变多行或是多行变单行。
将多行输入转换成单行输出
[root@server1 test]# cat example.txt
1 2 3 4 5 6
7&&& 8 9 10
[root@server1 test]# cat example.txt | xargs
1 2 3 4 5 6 7 8 9 10 11 12
将单行输入转换成多行输出
[root@server1 test]# cat example.txt | xargs | xargs& -n 2
-d选项为输入指定一个定制的定界符
# echo &splitXsplitXsplitXsplit& | xargs -d X
split split split split
可以结合-n参数
# echo &splitXsplitXsplitXsplit& | xargs -d X -n 2
split split
split split
读取stdin,将格式化参数传递给命令
[root@server1 test]# cat args.txt
[root@server1 test]# cat args.txt | xargs -n 1 sh ./cecho.sh
[root@server1 test]# cat args.txt | xargs -n 2 sh ./cecho.sh
arg1 arg2 #
[root@server1 test]# cat args.txt | xargs sh ./cecho.sh
arg1 arg2 arg3 #
在上面的例子中,我们直接为特定的命令(例如cecho.sh)提供命令行参数。这些参数都只源于args.txt文件。
-I指定一个替换字符串,与xargs结合使用时,对于每一个参数,命令都会被执行一次。
[root@server1 test]# cat args.txt | xargs -I {} sh ./cecho.sh -p {} -l
-p arg1 -l #
-p arg2 -l #
-p arg3 -l #
-I {}指定了替换字符串。对于每一个命令参数,字符串{}会被从stdin读取到的参数所替换。使用-I的时候,命令就似乎是在一个循环中执行一样。如果有三个参数,那么命令就会连同{}一起被执行三次,而{}在每一次执行中都会被替换为相应的参数。
结合find使用xargs
# find . -tpye f -name &*.txt& -print | xargs rm -f
这样做很危险。可能会删除不必要的文件。我们没法预测分隔find命令输出结果的定界符是&\n&还是&
&。很多文件名都可能包含空格符,而xargs很可能会误认为它们是定界符(例如,hell
text.txt会被xargs误认为hell和text.txt2个文件)
只要我们把find的输出作为xargs的输入,就必须将-print0与find结合使用,以字符null来分隔输出。
用find匹配并列出所有.txt文件,然后用xargs将这些文件删除:
# find . -tpye f -name &*.txt& -print0 | xargs -0 rm -f
这样就可以删除所有.txt文件。xargs -0将\0作为输入定界符。
统计源码目录中所有C程序文件的行数
# find src_path -type f -name &*.c& -print0 | xargs -0 wc -l
结合stdin,巧妙运用while语句和子shell
[root@server1 test]# cat example.txt
1 2 3 4 5 6
7&&& 8 9 10
[root@server1 test]# cat example.txt | ( do cat $done) 等同于# cat example.txt | xargs -n 1 | xargs -I {} cat {}
cat: 1: No such file or directory
cat: 3: No such file or directory
cat: 4: No such file or directory
cat: 5: No such file or directory
cat: 6: No such file or directory
cat: 7: No such file or directory
cat: 8: No such file or directory
cat: 9: No such file or directory
cat: 10: No such file or directory
cat: 11: No such file or directory
cat: 12: No such file or directory
在while循环中,可以将cat $arg替换成任意数量的命令,这样我们就可以对同一个参数执行多项命令。我们也可以借助管道,将输出传递给其他命令。这个技巧能适用于各种问题环境。子shell内部的多个命令可作为一个整体来运行。
tr可以对来自标准输入的字符进行替换、删除以及压缩。可以将一组字符变成另一组字符,因而通常也被称为转换(translate)命令
tr只能通过stdin(标准输入),而无法通过命令行参数来接受输入。
tr [options] set1 set2
将来自stdin的输入字符从set1映射到set2,并将其输出写入stdout。set1和set2是字符类或字符集。如果两个字符集的长度不相等,
那么set2会不断重复其最后一个字符,直到长度与set1相同。如果set2的长度大于set1,那么在set2中超过set1长度的那部分字符则全部
用tr删除字符
选项-d,可以通过指定需要被删除的字符集合,将出现在stdin中的特定字符清除掉:
[root@server1 test]# echo &Hello 123 world 345&P | tr -d &0-9&
Hello& world
字符集补集-c
从输入文本中将不再补集中的所有字符全部删除
[root@server1 test]# echo hello 1 char 2 next 4 | tr -d -c &0-9 \n&
用tr压缩字符
-s选项可以压缩输入中重复的字符:
[root@server1 test]# echo &GNU is&&&& not UNIX. Recursive right ?& | tr -s & &
GNU is not UNIX. Recursive right ?
[root@server1 test]# cat sum.txt
[root@server1 test]# cat sum.txt | echo $[$(tr '\n' '+' ) 0]
tr将&\n&替换成&+&,因为我们得到了字符串&1+2+3+4+5+&,但是在字符串的尾部多加了一个操作符+。为了抵消这个多出的操作符,于是追加一个0.
tr可以像使用集合一样使用各种不同的字符类,如下:
alnum:字母和数字
alpha:字母
cntrl:控制(非打印)字符
digit:数字
graph:图形字符
lower:小写字母
print:可打印字符
punct:标点符号
space:空白字符
upper:大写字母
xdigit:16进制字符
6. 排序、单一与重复
sort、uniq
按数字进行排序
# sort -n file.txt
按逆序进行排序
# sort -r file.txt
按月份进行排序(按照一月、二月、三月&&这样的顺序)
sort -M months.txt
根据捡或列进行排序
[root@server1 test]# cat data.txt
1 &&&& 2000
2 winxp&& 4000
3 bad&&&& 1000
4 linux&& 1000
-k指定了排序应该按照哪一个键(列号)来进行。
[root@server1 test]# sort -nrk 1 data.txt&& # -nr表示按第一列数字逆序排序,
4 linux&& 1000
3 bad&&&& 1000
2 winxp&& 4000
1 &&&& 2000
[root@server1 test]# sort -k 2 data.txt
3 bad&&&& 1000
4 linux&& 1000
1 &&&& 2000
2 winxp&& 4000
留意用于按照数字顺序进行排序的选项-n。就依据字母表排序和依据数字排序,sort命令对于字母表排序和数字排序有不同的处理方式。因此,如果要采用数字顺序排序,应该明确的给出-n选项
uniq命令通过消除重复内容,从给定输入中(stdin或命令行参数文件)找出单一的行。他也可以用来找出输入中出现的重复行。uniq只能用于排过序的数据输入,因此,uniq要么使用管道,要么将排过序的文件作为输入,并总是以这种方式与sort命令结合起来使用。
[root@server1 test]# cat sorted.txt
[root@server1 test]# uniq sorted.txt
[root@server1 test]# sort sorted.txt | uniq
[root@server1 test]# sort -u sorted.txt
[root@server1 test]# sort sorted.txt | uniq -u #只显示唯一的行(在输入文件中没有出现重复的行)
[root@server1 test]# sort sorted.txt | uniq -c& #统计各行在文件中出现的次数
[root@server1 test]# sort sorted.txt | uniq -d& #找出文件中重复的行
-s指定可以跳过前N个字符
-w指定用于比较的最大字符数
[root@server1 test]# cat data3.txt
d:04:linux
我们需要使用醒目的字符作为唯一的键。可以通过忽略前2个字符(-s 2),并使用-w选项(-w 2)指定用于比较的最大字符数的方式来选定该键。
[root@server1 test]# sort data3.txt | uniq -s 2 -w 2
d:04:linux
57页-s -w -z
用uniq生成字符串样式
有一个包含重复字符的字符串,如何才能知道每个字符在字符串中出现的次数,并依照下面的格式输出字符串?
输入:ahebhaaa
输出:4a1b1e2h
# echo ahebhaaa | sed &s/[^.]/&\n/g& | sed &/^$/d& | sort | uniq -c | tr -d & \n&
sed &s/[^.]/&\n/g&:在每个字符后追加一个换行符,使得每行只出现一个字符。这让我们可以用sort命令对字符进行排序。sort命令只能用于有换行符分隔的记录上
sed &/^$/d&:最后一个字符会被sed替换成&字符+\n&,因此会多出一个换行符并最后形成空行。这个命令就是用来删除最后的空行
tr -d & \n&:将输入中的空格和换行符删除,生成所要求输出的格式
7. 分隔文件和数据
[root@server1 test]# dd if=/dev/zero bs=100k count=1 of=data.file
[root@server1 test]# split -b 10k data.file
[root@server1 test]# ls
data.file& xaa& xab& xac& xad& xae& xaf& xag& xah& xai& xaj
上面的命令将data.file分隔成多个文件,每一个文件的大小为10k。这些文件以xaa、xab、xac这样方式命名。这意味着它们都有一个字母后缀。如果想以数字为后缀,可以另外使用-d参数。此外,使用-a -length指定后缀长度。
[root@server1 test]# split -b 10k data.file -d -a 4
[root@server1 test]# ls
data.file& x0000& x0001& x0002& x0003& x0004& x0005& x0006& x0007& x0008& x0009
上面data.file分隔后文件的前缀都有&x&。我们也可以通过提供一个前缀名以使用我们自己设定的文件名前缀。
[root@server1 test]# split -b 10k data.file -d -a 4 split_file
[root@server1 test]# ls
data.file&&&&&& split_file0001& split_file0003& split_file0005& split_file0007& split_file0009
split_file0000& split_file0002& split_file0004& split_file0006& split_file0008
如果不想按照数据块大小,而是需要根据行数来分隔文件的话,可以使用-l no_of&&lines行数
[root@server1 test]# split -l 10 data.file
csplit:能够根据指定的条件和字符串匹配选项对log文件进行分隔,是split工具的一个变体,split只能够根据数据大小或行数分隔文件,而csplit可以根据文本自身的特点进行分隔。是否存在某个单词或文本内容都可以作为分隔文件的条件。
[root@server1 test]# cat server.log
[connection] 192.168.0.1 success
[connection] 192.168.0.2 failed
[disconnect] 192.168.0.3 pending
[connection] 192.168.0.4 success
[connection] 192.168.0.1 failed
[connection] 192.168.0.2 failed
[disconnect] 192.168.0.3 success
[connection] 192.168.0.4 failed
[connection] 192.168.0.1 pending
[connection] 192.168.0.2 pending
[disconnect] 192.168.0.3 pending
[connection] 192.168.0.4 failed
我们需要将这个日志文件分隔成server1.log、server2.log和server3.log,这些文件的内容分别取自原文件中不同的SERVER部分。如下:
csplit server.log /SERVER/ -n 2 -s {*} -f server -b &%02d.log&; rm server00.log
这个命令说明如下:
/SERVER/&&& 用来匹配某一行,分隔过程即从此开始
/[REGEX]/&& 表示文本样式。包括从当前行(第一行)直到(但不包括)包含&SERVER&的匹配行
-n&&&&&&&&& 指定分割后的文件名后缀的数字个数
-s&&&&&&&&& 使命令进入静止模式,不打印其他信息
{*}&&&&&&&& 表示根据匹配重复执行分割,直到文件末尾为止。可以用{整数}的形式来指定分割执行的次数
-f&&&&&&&&& 指定分割后的文件名前缀
-b&&&&&&&&& 指定后缀格式。例如&%02d.log&,类似于C语言中printf的参数格式。在这里的文件名=前缀+后缀=server+%02d.log。
因为分割后的第一个文件没有任何内容(匹配的单词就位于文件的第一行中),所以我们删除了server00.log。
根据扩展名切分文件名
借助%操作符可以轻松将名称部分从&名称.扩展名&这种格式的文件名中提取出来
[root@server1 ~]# URL=www.myonlinemanual.net
[root@server1 ~]# echo ${URL%.*}&&&
#删除所匹配的字符串,%属于非贪婪(non-greedy)操作。它从右到左边找出匹配通配符的最短结果。%%操作符与%相似,但行为模式却是贪婪的
(greedy),这意味着它会匹配符合条件的最长的字符串
www.linuxeye
[root@server1 ~]# echo ${URL%%.*}
[root@server1 ~]# echo ${URL#*.}&&& #删除所匹配的字符串,#操作符与%类似,不过求职方向是从左向右。##操作符则用&.从左向右执行贪婪匹配。
[root@server1 ~]# echo ${URL##*.}
因为文件名中可能包含多个&.&字符,所以相对于#,##更适合于从文件名中提取扩展名,##执行的是贪婪匹配,因而总是能准确的提取出扩展名。
8. 交互输入自动化
[root@server1 test]# cat interactive.sh
#!/bin/bash
read -p &Enter number:&
read -p &Enter name:&
echo You have entered $no ,$
[root@server1 test]# echo -e &1\nhello\n& | sh interactive.sh
You have entered 1 ,hello
[root@server1 test]# echo -e &1\nhello\n& & input.data
[root@server1 test]# cat input.data
[root@server1 test]# sh interactive.sh & input.data
You have entered 1 ,hello
expect实现自动化
参考:/shell/204.html
spawn&&&&&&& 参数指定需要自动化哪一个命令
expect&&&&&&& 参数提供需要等待的消息
send&&&&&&&&&& 是要发送的消息
expect eof& 指明命令交互结束
1. #!、shebang意义
Linux环境中的任何脚本语言,都是以这样一个被称为shebang的特殊行作为起始的,在这行中,字符#!被置于解释器路径之前。/bin/bash是解释器的位置
http://zh.wikipedia.org/wiki/Shebang
2. echo、printf
echo 后面不用引号,用双引号,单引号区别,并总结双引号中需要转义(\)的特殊字符
printf使用引用文本或由空格分隔的参数,我们可以在printf中使用格式化字符串。我们还可以指定字符串的宽度、左右对齐方式等。在默认情况下,printf并不像echo命令一样会自动添加换行符,我们必须在需要的时候手动添加,比如在下面的脚本中:
#!/bin/bash
printf &%-5s %-10s %-4s\n& No Name Mark
printf &%-5s %-10s %-4.2f\n& 1 Sarath 80.3456
printf &%-5s %-10s %-4.2f\n& 2 James 90.9989
printf &%-5s %-10s %-4.2f\n& 3 Jeff 77.564
输出结果:
No&&& Name&&&&&& Mark
1&&&& Sarath&&&& 80.35
2&&&& James&&&&& 91.00
3&&&& Jeff&&&&&& 77.56
%s、%c、%d、%f都是格式化字符,其所对应的参数可以置于带引号的格式化字符串之后。
%-5s格式化为左对齐宽度为5的字符串替代(-表示左对齐),如果不用-指定对齐方式,字符串则采用右对齐形式。宽度指定了保留给某个变量的字符数,列
和列本身有一个空字符串。对Name而言,保留宽度为10,所以看起来列和列之间有11个字符串。因此,任何Name字段的内容都会被显示在10字符宽的
保留区域内,如果内容不足10字符,余下的则会以空格符填充。如果超过10个字符,列对齐效果将被打乱。
%-4.2,其中.2指定保留2个小数位,对小数部分四舍五入。注意,在每行格式字符串后都有一个换行符\n。
3. 颜色输出
打印彩色文本对应颜色码:重置=0,黑色=30,红色=31,绿色=32,黄色=33,蓝色=34,洋红=35,青色=36,白色=37
打印彩色背景对应颜色码:重置=0,黑色=40,红色=41,绿色=42,黄色=43,蓝色=44,洋红=45,青色=46,白色=47
echo -e &\e[1;31mThis is red text\e[0m&
echo -e &\e[1;42mGreen background\e[0m&
4. cat /proc/`pgrep `/environ | tr &\0& &\n&
tr &\0& &\n& 重新格式化输出,将\0(null字符)替换成\n(换行)
设定小数精度:scale=2 将小数位个数设置为2.
echo &scale=2;3/8&P | bc
进制转换:
echo &obase=2;100&P | bc
1100100 #十进制转换成二进制
echo &obase=10;ibase=2;1100100&P | bc
100 #二进制转换成十进制
计算平方以及平方根:
echo &sqrt(100)& | bc
echo &10^10&P | bc
6. stdin、stdout、stder、tee
0 & stdin(标准输入)
1 & stdout (标准输出)
2 & stderr (标准错误)
$echo a1 & a1;cp a1 a2;cp a2 a3 ;chmod 000 a1
$ cat * | tee -a out.txt | cat -n
cat: a1: Permission denied
$ cat out.txt
tee命令接收到来自stdin的数据。它将stdout的一份副本写入文件out.txt。同时将另一份副本作为后续命令的stdin。命令cat -n将从stdin中接收到的每一行数据前加上行号并写入stdout。-a参数可以用于追加内容
可以使用stdin作为命令参数,只需要将-作为命令的文件名参数即可:
$ echo who is this | tee -
who is this
who is this
7. 自定义文件描述符
文件描述符是用于访问文件的一个抽象指针。存取文件离不开被称为&文件描述符&的特殊数字。0、1和2分别是stdin、stdout和stderr的预留描述符。
我们可以使用exec命令创建自定义的文件描述符。3中模式:只读模式;截断模式;追加模式
为读取文件创建一个文件描述符:
# touch input.txt
# exec 3&input.txt& #使用文件描述符3打开并读取文件
# echo This is a test line & input.txt
# exec 3&input.txt
This is a test line
如果要再次读取,我们就不能再继续使用文件描述符3了,而是需要用exec重新分配文件描述符3以便用于读取。
创建一个文件描述符用户写入(截断模式):
# exec 4&output.txt #打开文件用于写入
# echo newline &&4
# cat output.txt
创建一个文件描述符用于写入(追加模式):
# exec 5&&input.txt
# echo appended line &&5
# cat input.txt
This is a test line
appended line
8. 数组和关联数组
bash同时支持普通数组和关联数组。普通数组只能使用整数作为数组索引,而关联数组可以使用字符串作为数组索引。关联数组是从bash4.0开始被引入。
定义关联数组
首先需要使用单独的声明语句将一个变量名声明为关联数组。声明语句如下:
# declare -A ass_array
声明之后,可以用两种方法将元素添加到关联数组中。
1). 利用内嵌索引值列表法,提供一个索引值列表:
# ass_array=([index1]=val1 [index2]=val2)
2). 使用独立的索引值进行赋值:
# ass_array[index1]=val1
# ass_array[index2]=val2
列出数组索引
每一个数组元素都有一个索引用于查找。普通数组和关联数组具有不同的索引类型
9. 获取终端信息
获取终端的行数和列数:
tput lines
打印出当前终端名:
tput longname
将光标移动到方位(100,100)处:
tput cup 100 100
设置终端背景色:
tput setb no #no取值在0~7之间
将文本前景色设置为白色:
tput serf no #no取值在0~7之间
设置文本样式为粗体:
删除当前光标位置到行尾的所有内容:
在输入密码的时候,不能让输入的内容显示出来,在下面的例子中,我们将看到如何使用stty来实现这个要求:
#!/bin/bash
#Filename:password.sh
echo -e &Enter password: &
stty -echo
read password
echo $password
echo Password read.
其中,选项-echo禁止将输出发送到终端,而选项echo则允许发送输出。
用tput和sleep从0开始计数到40:
#!/bin/bash
#Filename sleep.sh
echo -n Count:
if [ $count -lt 40 ];
then let count++;
else exit 0;
在上面的例子中,变量count初始化为0,随后每循环一次便增加1。echo语句打印出count的值。我们用tput
sc储存光标位置。在每次循环中,我们通过恢复之前储存的光标位置,在终端中打印出新的count值。恢复光标位置的命令是tput rc。tput
ed清除从当前光标位置到行尾之间的所有内容,使得旧的count值可以被清除并写入新值。循环内的1s延时是通过sleep命令来实现的。
10. 调试shell脚本
set -x:在执行时显示参数和命令。
set +x:禁止调试。
set -v:当命令进行读取时显示输入。
set +v:禁止打印输入。
11. Fork炸弹
: 是函数名,执行一个调用自己的递归并且 pipe 到自己,& 表示后台执行程序,最后的一个 : 是在函数外调用和执行 : () 这个函数的意思
参数可以组合使用
# read -n 2 var&& 读取2个字符并存入变量var
# echo $var
# read -s var& #用不回显的方式读取密码
# echo $var
# read -p &Enter input:& var&&& #显示提示信息
# read -t 2 var&&& #在2s内将输入的字符串存入到变量var
# read -d &:& var&&& #使用:作为定界符结束输入行
13. 字段分隔符和迭代器
内部字段分隔符(Internal Field Separator, IFS)
# cat ifs.sh
#!/bin/bash
data=&name,sex,rollno,location&
oldIFS=$IFS
for item in $
echo Item:$item
IFS=$oldIFS
结果如下:
Item:rollno
Item:location
IFS的默认值为空白符(换行符、制表符或者空格)。
当IFS被设置为逗号时,shell将逗号解释成一个定界符,因此变量$item在每次迭代中读取由逗号分隔的字串作为变量值。
如果没有把IFS设置成&,&,那么上面的脚本将会全部数据作为单个字符串打印出来。
14. Bash多种类型的循环
while 循环
until 循环
&&逻辑与运算符&& ||逻辑或运算符
15. 算术比较
条件通常被放置在封闭的中括号内。一定要注意在[]与操作数之间有一个空格。
-ge:大于或等于
-le:小于或等于
-ne:不等于
可以结合 -a 逻辑与 -o 逻辑或条件进行测试
文件系统相关属性测试:
[ -f $file_var ]&&& 如果给定的变量包含正常的文件路径或文件名,则返回真
[ -x $var ]&&& 如果给定的变量包含的文件可执行,则返回真
[ -d $var ]&&& 如果给定的变量包含的是目录,则返回真
[ -e $var ]&&& 如果给定的变量包含的文件存在,则返回真
[ -c $var ]&&& 如果给定的变量包含的是一个字符设备文件的路径,则返回真
[ -b $var ]&&& 如果给定的变量包含的是一个块设备文件的路径,则返回真
[ -w $var ]&&& 如果给定的变量包含的文件可写,则返回真
[ -r $var ]&&& 如果给定的变量包含的文件可读,则返回真
[ -L $var ]&&& 如果给定的变量包含的是一个符号链接,则返回真
字符串比较:
使用字符串比较是,最好用双中括号,因为有时候采用单个中括号会产生错误,所以最好避开他们。
[[ $str1 = $str2 ]]&&& 当str1等于str2时,返回真。str1和str2包含的文本是一模一样
[[ $str1 == $str2 ]]&&& 这是检查字符串是否相等的另一种写法。也可以检查两个字符串是否不同
[[ $str1 != $str2 ]]&&& 如果str1和str2不相同,则返回真
[[ $str1 > $str2 ]]&&& 如果str1的字母序比str2大,则返回真
[[ $str1 < $str2 ]]&&& 如果str1的字母序比str2小,则返回真
[[ -z $str1 ]]&&& 如果str1包含的是空字符串,则返回真
[[ -n $str1 ]]&&& 如果str1包含的是非空字符串,则返回真
注意:在=前后各有一个空格,如果忘记加空格,那就不是比较关系了,而变成了赋值语句
标签: , , , , , , , ,
& | & & | & & | & & | & & | & & | & & | & & | & & | & & | & & | & & | & & | &
最热门文章
8673 views
1365 views
1317 views
1125 views
1066 views
友情链接 |
本站进行139次查询

我要回帖

更多关于 麻将技巧 的文章

 

随机推荐