作者:洪海辉
《Linux 命令、编辑器与shell编程》(美)Mark G.Sobell 著 杨明军 王凤芹 译 清华大学出版社
2007-12-24
终端处理字符:
ctrl+z 挂起,可用fg切换到前台,jobs 查看后台任务情况;
ctrl+w 删除单词;
ctrl+u 删除行 ctrl+x好像没有效果;
定位工具:
which 只在设定的路径搜索,只报告第一个找到的;
whereis 在标准路径,显示所有的;
type 确定文件是否为内置命令;
apropos 关键字
whatis 完全匹配关键字;
符号链接:
内置命令pwd显示链接名;
工具(/bin/pwd)显示路径;
info bash builtin 列出内置命令;
2007-12-25
vim的使用:
ctrl+w 删除单词;
ctrl+h 删除行 ctrl+u;
:redo ctrl+r 撤销;
ctrl+l 刷新;
vim -r 检查交换文件;
命令模式移动光标
字符移动 空格 h和l;Ff
字移动 Ww W按空白分隔字符
行移动 j k
句子 ()
段 {}
屏幕 H M L
删除
dG 删除到末尾;
d1G 从开始删除;
d0 从行的开始;
~ 修改大小写;
替换
1,。 开始到当行;
。,$ 当前到末尾;
1,$ 或 % 所有;
:1,$s/ten/te/g 所有行的所有ten替换成te;
2008-01-05
数组变量:
赋值
NAMES=(max helen sam zach)
NAMES[1]=fly
引用值
#echo ${NAMES[2]}
sam
------------------------------------------------------------
下标[*]和[@]的区别:
作用都是提取整个数组,但是加双引号工作机制却不同:
@将原来的数组复制到新的数组,新旧一样,相当于复制;
*将原来的数组当一个元素复制到新的数组
例:
A=("${NAMES[*]}")
B=("${NAMES[@]}")
用declare -a 显示数组内容
[root@Test ~]# declare -a
declare -a NAMES='([0]="max" [1]="helen" [2]="sam" [3]="zach")'
declare -a A='([0]="max helen sam zach")'
declare -a B='([0]="max" [1]="helen" [2]="sam" [3]="zach")'
echo ${#NAMES[*]} 元素的个数
[root@Test ~]# echo ${#NAMES[*]}
4
echo ${#NAMES[0]} 元素的长度
[root@Test ~]# echo ${#NAMES[0]}
3
------------------------------------------------------------------
((count=count-1))双扣号,保证shell看成算术表达式,变量不用$
$$ 进程ID,方便创建唯一的文件名;
$0 命令本身;
$! 后台进程PID;
$?退出状态;
$# 除命令本身外的参数个数;
$*和$&的区别:
$* 将所有参数当成一个整体(一个参数);
$@ 和原来的一样;
跟下标[*] [@]一样
--------------------------------------------------------------------
shift左移命令 为了得到任意一个参数,循环扫描命令行;
set 初始命令行参数值;
set $(date)
set date
----------------------------------------------------------------------
:- 使用默认值 ${name:-default}
:= 赋默认值 ${name:=default}
: 内置命令 赋值并不执行 : ${name:=default}
:? 显示错误信息,并返回状态1,shell不退出;${name:?message}
------------------------------------------------------------------------
路径操作符
# 最小去除前缀;
## 最大去除前缀;
% 最小去除前缀;
%% 最大去除前缀;
例:
[root@Test ~]# test=/usr/local/src/proftpd-1.2.10.tar.gz
[root@Test ~]# echo ${test}
/usr/local/src/proftpd-1.2.10.tar.gz
[root@Test ~]# echo ${test#/*}
usr/local/src/proftpd-1.2.10.tar.gz
[root@Test ~]# echo ${test##/*}
[root@Test ~]# echo ${test%/*}
/usr/local/src
[root@Test ~]# echo ${test%%/*}
[root@Test ~]# echo ${#test} 显示字符个数
36
--------------------------------------------------------------------------
sed的使用:
参数:
-n 显示除了p指令;
-i 将修改保存到文件;
指令:
d 删除,整行删除;
n 显示选中的行当前,从输入中读入下一行;
a 每一行之后追加文件,以\换行;
i 行之前追加;
c 替换文件(整行);
s 替换地址;
w 重定向到新文件;
r 追加行之后;
q 退出;
控制结构:
!NOT $!d 除了末行之外;
{} 指令组;为分隔
Pattern区和Hold区:
Pattern:工作平台(保存刚读入的行);
Hold:临时工作区
H P->H 将一个换行符和内容追加到H
h P->H 将P区替换掉H
G H->P 将一个换行符和内容追加到G
g H->P 将H区替换掉P
例:
sed '5 q' filename 显示前5行;
sed '2 a test' filename 第2行之后插入一个换行符和test;
sed '/the/n;p' file 所有匹配the不显示;
sed 's/^. /\t&/' filename 行首不是空格插入制表符;
(^. ) 行首不是空格;
s/^/\t/ 行首插入制表符;
s/ *$// 行尾的空格全部删除;
sed 'G' filename 每行之后插入一个空行;
倒序:
2,$ G
h
$! G
------------------------------------------------------------
cat
-A(-vET)
-b 对非空行进行编号;
-n 对所有行进行编号;
-s 去除多余的空白行;
cut
-c
-d 分隔符;
-f
例:
[root@Test sh]# ll |tr -s ' ' ' '|cut -f 5,9 -d ' '
2.3K a
2.2K b
4.0K BK/
436 ip.1
452 ip.2
264 ip.a
85K ip.list
22K ipList.temp
486 sample.sh*
9.9K selectInfo.sh*
4.0K temp/
tr -s 将多个空格化成单个空格;
[root@Test 20080114]# grep -n '^' test
1:a
2:b
3:c
4:d
'^' 匹配所有的行;
-n 对所有的行进行编号
[root@Test 20080114]# grep -h a * |sort|uniq -c
2 a
-h 不显示文件名;
uniq -c 对于重复的行只显示一遍,并对重复的次数进行统计;
[root@Test 20080114]# vi $(grep -l 'a' *)
2 files to edit
编辑多个匹配的文件;
-l 匹配的文件名;
#kill -9 0
对于普通用户来说相当于注销;
对于root等于关机,请慎用;
----------------------------------------------------------------
ls的参数:
-A 显示除了.. . 两个外的所有文件;
-F 显示文件特征;
-r 逆顺;
-t 按修改时间;
-x 行显示;
-1 一行显示一个文件;
----------------------------------------------------------------
sort
参数:
-b 排除字段之前的空格和TAB;
-f 将小写看成大写(大写在前);
-n 算术排序,负号和小数点有意义;
-r 逆顺;
-t x 分隔符x;
-u 重复的行只显示一次;
-k start[,stop]
注:
大写在小写之前;
空白符在之前;
第一遍比较无相同,不进行第二遍查询;
例:
#sort --key=2 test 第2字段;
#sort -k 2 -f test 第2字段,小写看成大写;
#sort -k 2 -b test 第2字段,字段前面的空白符和TAB忽略;
#sort -fb -k 3.4 test 第3字段的第4个字符开始;
#sort -b -k 3.4 -k -2f test
第一遍:第3字段的第4字符
第二遍:第2字段,小写看成大写;
#sort -k 1 -k 5 test
先第一字段(没有指定结尾,便是到结束),再第五字段;
但是如果第一遍比较没有相同,不进行第2遍比较;
#sort -k 1,1 -k 5 test
先第一字段,-k 1,1(第一字段的第一字符到stop:第一字段)
再进行第五字段;
#sort -u -k 1f -k 1 test
进行二遍比较,当有大小写相同的字段时;
------------------------------------------------------------
正则表达式:
星号:
/(.*)/ 与圆括号最长匹配;
/([^)]*)/ 与圆括号最短匹配;
空正则表达式:
/\(test\)/ 和/test/一样;
/a\(b*\)c/ 和/ab*c/一样;
替换字符串:
&符号 与正则匹配的字符串匹配
\n 转义数字
例:
:1,$/\([^,]*\),\(.*\)/\2 \1/
1,$ 所有的行;
\([^,]*\)和[^,]*一样,匹配除逗号外的任意字符串;
\2 代表第2个括号内的正则;
----------------------------------------------------------------
扩展正则:
+ 匹配字符前面1个或多个;
?匹配字符前面0个或1个
例:
/ab+c/ abc abbc
/ab?c/ ac abc
/(ab)+c/ abc ababc
/(ab)?c/ c abc
/ab|ac/ ab ac abac
/^Exit|^Quit/ 以Exit 或者Quit 开头的
/(D|N)\.Jones/ D.Jones N.JOnes
vim中 \|代表 |
特殊字符:
. 单个字符;
* 与*前面的0个或者多个字符;
\< 字的开始;
\> 字的末尾;