=========== 格式化
=========================
[root@zjs_nbs_gxq_ga wrq]# cat test
a a
a
b b
b
c c
c
d d d
[root@zjs_nbs_gxq_ga wrq]# cat test |xargs
a a a b b b c c c d d d
[root@zjs_nbs_gxq_ga wrq]# cat test |xargs -n 3
a a a
b b b
c c c
d d d
[root@zjs_nbs_gxq_ga wrq]# cat test |xargs -n 3|tr " "
"\t"
a a
a
b b
b
c c
c
d d
d
[root@zjs_nbs_gxq_ga wrq]# sed '$!N;s/\n/\t/' test
# 合并每个奇数行和偶数行
a a
a
b
b
b
c c
c d d d
vi里 :%s/\(^.*$\)\n\(^.*$\)/\1\2/g # 合并每个奇数行和偶数行
[root@zjs_nbs_gxq_ga wrq]# sed ':a;N;s/\n/\t/;ba;' test #
合并所有行
[root@zjs_nbs_gxq_ga wrq]# sed '/b/{N;s/\n/\t/}' test
# 合并匹配模式及其下一行
a a
a
b b
b
c
c
c
d d d
=============== 删除空白行
=================
[root@zjs_nbs_gxq_ga wrq]# cat file
abc
bcd
cde
[root@zjs_nbs_gxq_ga wrq]# cat file |tr -s '\n'
abc
bcd
cde
[root@zjs_nbs_gxq_ga wrq]# sed '/^$/d'
file
abc
bcd
cde
[root@zjs_nbs_gxq_ga wrq]# sed '/^[[:space:]]*$/d'
file
abc
bcd
cde
[root@zjs_nbs_gxq_ga wrq]# sed -e '/^$/{N;/^\n*$/D}' file
# 多个连续的空行合并为一个空行
abc
bcd
cde
=========== 删除重复行
============
[root@zjs_nbs_gxq_ga
wrq]# cat filename
abc
a bc
bcd
bcd
abc
abc
[root@zjs_nbs_gxq_ga wrq]# awk
'!a[$0]++' filename # 原顺序
abc
a bc
bcd
abc
[root@zjs_nbs_gxq_ga wrq]# cat filename |sort| uniq #
换顺序
abc
abc
a bc
bcd
================== 置换前两列 ====================
[root@zjs_nbs_gxq_ga wrq]#cat test1
first:second
one:two
[root@zjs_nbs_gxq_ga wrq]#sed 's/\(.*\):\(.*\)/\2:\1/'
test1
second:first
two:one
[root@zjs_nbs_gxq_ga wrq]#
================ .* 匹配任意数目的字符 =============
^_ _ *.* 匹配具有一个或多个前导空格的行
如:grep "^ *.*"
filename
grep -c '^$' filename ;计算文件中的空行数
================ 交换行 ================
1已知行号时交换两行
zj@zj:~/Script/blog_script$ cat test
baidu music so terrible so bad
microsoft haha haha
yahoo byebye
google princess so good
这里是交换1,4行.当然你可以根据自己需要修改
zj@zj:~/Script/blog_script$ for(( i=1;i<=4;i++ )); do
case $i in 1) sed -n 4p test;; 4) sed -n 1p
test;; *) sed
-n ${i}p test;; esac; done
google princess so good
microsoft haha haha
yahoo byebye
baidu music so terrible so bad
连续时好说:
zj@zj:~/Script/blog_script$ sed '1{h;d};2{G}' test
microsoft haha haha
baidu music so terrible so bad
yahoo byebye
google princess so good
2不知道行号
要交换的两行是连续行的情况下:
zj@zj:~/Script/blog_script$ sed '/baidu/{h;d};/microsoft/{G}'
test
microsoft haha haha
baidu music so terrible so bad
yahoo byebye
google princess so good
ps:交换包含bai与microsoft的行
两行不连续的情况:
zj@zj:~/Script/blog_script$ sed
'/baidu/{:a;N;/google/!ba;s/\([^\n]*\)\n\(.*\)\n\(.*\)/\3\n\2\n\1/}'
test
google princess so good
microsoft haha haha
yahoo byebye
baidu music so terrible so bad
ps:交换含有baidu与google的行
研究了下写了个不论连续不连续的都可以的:
zj@zj:~/Script/blog_script$ sed
'/baidu/{:a;N;/microsoft/!ba;/[^\n]*baidu[^\n]*\n[^\n]*microsoft[^\n]*$/{s/\([^
\n]*baidu[^\n]*\)\n\(.*\)/\2\n\1/};s/\([^\n]*\)\n\(.*\)\n\(.*\)/\3\n\2\n\1/}'
test
microsoft haha haha
baidu music so terrible so bad
yahoo byebye
google princess so good
zj@zj:~/Script/blog_script$ sed
'/baidu/{:a;N;/google/!ba;/[^\n]*baidu[^\n]*\n[^\n]*google[^\n]*$/{s/\([^\n]
*baidu[^\n]*\)\n\(.*\)/\2\n\1/;};s/\([^\n]*\)\n\(.*\)\n\(.*\)/\3\n\2\n\1/}'
test
google princess so good
microsoft haha haha
yahoo byebye
baidu music so terrible so bad
ps:上面代码
/baidu/{....} 遇到含有baidu的行,开始做{}中的命令序列
:a;N;/google/!ba 循环读信息,直到读取google.
/[^\n]*baidu[^\n]*\n[^\n]*google[^\n]*$/这个就是说如果哦baidu与google之间只有一个\n,即这两个是连续行就:{s/\([^
\n]*baidu[^\n]*\)\n\(.*\)/\2\n\1/;}交换这两行
如果不匹配上面的模式就是说不是连续行了.
s/\([^\n]*\)\n\(.*\)\n\(.*\)/\3\n\2\n\1/}
而在匹配连续行的情况下是不可能匹配上面表达式的.ok~~~~
3.忘了还有交互奇偶行
zj@zj:~/Script/blog_script$ sed
'$!N;s/\([^\n]*\)\n\([^\n]*\)/\2\n\1/' test
microsoft haha haha
baidu music so terrible so bad
google princess so good
yahoo byebye
========================================================
●Shell中的环境变量有哪些?它们各有什么作用?
环境变量在实际Shell编程中广泛使用,是需要重点掌握的。现在只介绍几个主要的常用的变量:
1)$HOME 当前用户的主目录
2)$PATH 命令的搜索路径
3)$PS1 命令提示符,就是你在Linux命令行下那个总出现的提示符,通常是$,也可能定制成其他类型。
4)$PS2 第二命令提示符,比如当你输入的命令需要接受输入时,也会给出一个提示符,通常为>
5)$IFS 输入字段分隔符,就是当你读入信息时用来将字符串分隔为单词的符号,通常为空格、制表符以及回车符号。
6)$0 所执行的Shell脚本的名字
7)$# Shell脚本(命令)传递的参数个数
8)$$ 所执行的Shell脚本的进程号,通常用来生成唯一的临时文件名