linux命令补遗 - 3

http://tianya23.blog.51cto.com/1081650/369593 

(1)VI中的缩进

自动缩进打开:

在命令模式下,输入 :set autoindent,然后按回车打开自动缩进。通过设置 shiftwidth 确定缩进级别。例如,:set shiftwidth=4 把每级缩进设置为四个空格

设置缩进级别:

在命令模式下,可以使用 >> 命令让现有的一行增加一级缩进,使用 << 命令减少一级缩进。在这些命令前面加上一个整数,即可让多行增加或减少一级缩进。

缩进代码块

可以使用 :set noautoindent 命令关闭自动缩进。还可以使用这个命令和 autoindent 命令的简写,即 :set ai 和 :set noai。还可以使用 :set ai sw=4 在一个命令中打开缩进并设置缩进级别。

如果希望每次启动 vi 会话时都启用自动缩进并把缩进级别设置为四个空格,那么在主目录中的 .exrc 文件中添加 set ai sw=4行。

 (2)搜索 

可以参考:http://www.ibm.com/developerworks/cn/aix/library/au-vitips.html

  (3)VI插件

http://www.ibm.com/developerworks/cn/linux/l-tip-vim2/index.html

http://www.ibm.com/developerworks/cn/linux/l-tip-vim1/index.html

 (4)配对符号间的跳转

%:将光标定位在大括号,中括号上,然后按下输入,将能让光标定位于该大括号或是中括号的另一半上。对检查逻辑复杂,构造繁乱的代码 中的错误极其有用。

 (5)列出目录,排序操作

按照时间排序:-t, 一般使用倒序:-r,即倒序,这样最新的文件在最下面,容易找到。 常用 ll -tr

按照大小排序:ll -Sh, 或者ll -Shr

 (6)Yum安装之后的位置查找

先#rpm -qa | grep ABC, 再使用rpm -ql packageName

例子如下:查找安装好的qt 

yum install qt.x86_64

#rpm -qa | grep qt

qt-3.3.6-23.el5

再rpm -ql qt-3.3.6-23.el5 

 (7)C、C++语言的编译相关 

gcc -v:查看gcc的版本

cc hello.c -o hello.o:使用cc编译c语言代码

gcc hello.c -o helloworld.o:使用gcc编译c语言代码 

 (8)制作makefile文件

 qmake -project

qmake -makefile

 

VI 可参考:http://yang2001.blog.51cto.com/25307/271807

 

1、交换两个字符位置xp;

        上下两行调换ddp;

        上下两行合并 J;

        从当前位置复制到行尾y$ 

        如果要粘贴到其他地方 p 就可以了

删除所有行 dG

从当前位置删除到行尾d$        

 

2、:X

保存后就加密了 

:X

然后系统会提示输入密码

输入密码后存盘退出

下次编辑时请使用

vi -x filename

系统会提示你输入密码,呵呵

例:以HP-UX为例

a、加密

   vi file

   :X

   (Are you sure?(y/n)[n]:)回答y

   输入密码回车以后再保存,就加密成功了

b、解密

   vi -C file 或者 vi -x file

   在 Key: 后面输入密码进入file

   :X

   (Are you sure?(y/n)[n]:)回答y

   直接回车以后再用 wq 或者 wq! 保存,就把file解密成功了

顺便提一下:加密后的脚本不能被解释执行!

c、:X(uppcase X)

 key:......

后用wq!存盘,不能用:x,否则加密失效

 打开时:

  vi -x file

  key: ..... 

 

4、单个字符替换用r;                

        覆盖多个字符用R;

        用多个字符替换一个字符用s;

        整行替换用S; 

:%s/old_word/new_word/g;这个指令是于在整个文件中替换特定字符串 ;

 

5、H 跳到第一行

        M 跳到中间一行

        L 跳到最后一行 

将光标移到第n行,按下 mk

将光标移到第m行,按下 "ay‘k

即将第n到m的行存到a寄存器,以此类推,b,c........寄存器等 

想粘贴到某处,直接将光标移到某地,按下 ‘ap 即可 

 

6、删除命令

        d l 删除当前字符(与x命令功能相同)

        d 0 删除到某一行的开始位置

        d ^ 删除到某一行的第一个字符位置(不包括空格或TA B字符)

        d 3 w 删除到第三个单词的结尾位置

        d b 删除到某个单词的开始位置

        d W 删除到某个以空格作为分隔符的单词的结尾位置

        d B 删除到某个以空格作为分隔符的单词的开始位置

        d 7 B 删除到前面7个以空格作为分隔符的单词的开始位置

        d) 删除到某个语句的结尾位置

        d 4) 删除到第四个语句的结尾位置

        d( 删除到某个语句的开始位置

        d } 删除到某个段落的结尾位置

        d { 删除到某个段落的开始位置

        d 7 { 删除到当前段落起始位置之前的第7个段落位置

        d /t e x t 删除从文本中出现“ t e x t”中所指定字样的位置,一直向前直到下一个该字样所出现的位置(但不包括该字样)之间的内容

        d fc 删除从文本中出现字符“c”的位置,一直向前直到下一个该字符所出现的位置(包括

该字符)之间的内容

        d tc 删除当前行直到下一个字符“ c”所出现位置之间的内容

        D 删除到某一行的结尾

        5 d d 删除从当前行所开始的5行内容

        d L 删除直到屏幕上最后一行的内容

        d H 删除直到屏幕上第一行的内容

        d G 删除直到工作缓存区结尾的内容

        d 1 G 删除直到工作缓存区开始的内容

 

7、修改操作

        c l 更改当前字符

        c w 修改到某个单词的结尾位置

        c 3 w 修改到第三个单词的结尾位置

        c b 修改到某个单词的开始位置

        c W 修改到某个以空格作为分隔符的单词的结尾位置

        c B 修改到某个以空格作为分隔符的单词的开始位置

        c 7 B 修改到前面7个以空格作为分隔符的单词的开始位置

        c 0 修改到某行的结尾位置

        c) 修改到某个语句的结尾位置

        c 4) 修改到第四个语句的结尾位置

        c( 修改到某个语句的开始位置

        c } 修改到某个段落的结尾位置

        c { 修改到某个段落的开始位置

        c 7 { 修改到当前段落起始位置之前的第7个段落位置

        c tc 修改当前行直到下一个字符c所出现位置之间的内容

        C 修改到某一行的结尾

        c c 修改当前行

        5 c c 修改从当前行所开始的5行内容

折行

:set wrapmargin=4 

:set number 加行号! 

:g/$/s// ABC/g

:g/^/s//def /g

在文本每行的头和尾添加字符串.

 

8、替换操作

        s 将当前字符替换为一个或多个字符

        S 将当前行替换为一个或多个字符

        5 s 将从当前字符开始的5个字符替换为一个或多个字符

注:vi替换使用规则:

:g/s1/s/s2/s3/g

第一个g表示对每一个包括s1的行都进行替换,第二个g表示对每一行包括s1的行所有的s2都用s3替换

s表示替换,s2是要被替换的字符串,他可以和s1相同(如果相同的话用//代替),s3是替换字符串 

 

9、移动

fx

往右移动到 x 字符上--〉fx

往左移动到 x 字符上--〉Fx

往右移动到 x 字符前--〉tx

往左移动到 x 字符后--〉Tx

(注意:以上四个命令中,其中x是键入的字符)

        ;-->分号,配合 f 和 t 使用,重复一次 

        ,-->逗号,配合 f 和 t 使用,反方向重复一次

 

10、

标记文本

  mchar   用字母char标记当前光标的位置

  `char   移至char所标记处

  ‘char   移至char标记所在行的开头处

  "     移至当前行上一次所在位置(在光标移动之后)――一个双引号

  ‘‘    移至当前行上第一次所在位置的行的开头处(在光标移动之后)――两个单引号 

ctrl+f向下翻页,ctrl+b向上翻页(对于telnet上去的时候比较有用)

shift+4到本行末尾,shift+6到本行开头

 

11、追加到缓冲区

对于已经有内容的缓冲区,可以继续追加内容在其后面,例如:

"Ad4w      删除光标后4个字,并附加到缓冲区a

"Ay)       取样从光标到文件尾的内容,并附加到缓冲区a

"K3yy      取样从光标所在行起的3行内容,并附加到缓冲区k

注意:在追加缓冲区的命令中,原缓冲区的名字一定要大写,才能将内容追加进去,否则是覆盖原缓冲区的内容。追加内容在原缓冲区末尾另起一行。

 

12、在:命令行模式下,首先可以确定命令的范围

.表示当前行;数字表示行号,如1表示第一行,2表示第二行;$表示最后一行

范围用,分隔

然后用命令

d表示删除,y表示复制......大家都知道的

最后说一句,%表示全文

:%d

是删除全文 

 

13、恢复前几次操作应用什么命令呀? :em52: 

 

14、:n,n1 d

n和n1都是行数, d是删除这些行 .表示当前的行。

: n

n是行数,直接转到n行。

: r 文件名

把文件添加到当前的文件中

:n,n1 w 文件名

把从n行到n1行写道另外一个文件中 

 

15、查找:

在一个单词上用*,就向下查找此单词,#是向上

用/\<hello\>查找hello,就不会查找到hello_world(用此替换也很好用)

替换:

如有一文件,内容为:

aa

bb

cc

dd

用:%s/.*/printf("& is :%d\\n",&)/

文件内容为变为:

printf("aa is :%d\n",aa) 

printf("bb is :%d\n",bb) 

printf("cc is :%d\n",cc) 

printf("dd is :%d\n",dd) 

&为查找到的内容

用:~为重复上一次替换

用系统命令编辑:

如有一文件,内容为:

333

222

334

444

111

553

554

233

运行命令:%!sort 文件内容为:

111

222

233

333

334

444

553

554

用此方法可以使用许多系统命令进行编辑,大家可以灵活运用

其他特殊用法:

用q: 看一看有什么用? 可以编辑你用过的命令

程序中在一个调用函数(如:printf)上用K,可以直接调出printf的帮助

 

这些是我比较常用的,并且我觉的很有用的命令,敬请指教。 

 

16、、:n1,n2w filename (把行N1-N2之间内容写入新文件FILENAME)

:.=(显示光标所在行的行号)

u(恢复上一次的操作)

:!(shell-command 执行SHELL命令的操作)

:n (直接把光标定义到N行) 

:line1,line2mline3: 将line1--line2之间的内容移到line3下 相当于word的剪贴

:line1,line2tline3:将line1--line2之间的内容copyline3下,相当于word的粘贴  

 

17、由于vi 是建立在 EX 上的 所以 当键入 : 时就来到了 EX 命令状态 

:ab string strings 

例如 ":ab usa United States of America" ,

当你在文件里插入 usa 时 

United States of America 就蹦出来了

:map keys new_seq 

定义你当前 键盘命令 

:set [all] 

vi or ex  的编辑状态

如 显示每行 :set nu 

 

18、

3、把文件内容反转:g/^/m0/  ------〉这个m0怎么解析 呢 ?

valentine 解释:

xp和ddp 应该理解为删除一个字符(x)和删除一行(dd),然后在p(paste),这样便不需记新命令了.

把文件内容反转 (按行反转)

:g/^/m0/ 应该是 :g/^/m0 无最后的/

m-->move

0-->line No 1

试想,从第1行开始,每一行依次放在文件的开头处,会有什么结果???

 

 19、Shell的调试

http://bbs.chinaunix.net/thread-1849499-1-1.html

linux论坛:http://bbs.chinaunix.net/forum-24-1.html

 20、把shell在萤幕的输出同时保在log

./test.sh | tee test.log

 21、批量重命名

http://blogold.chinaunix.net/u1/56521/showart_2012781.html

将当前目录里面所有.txt的文件重命名为.sql的文件:
rename 's/\.txt$/\.sql/' *.txt

去掉当前目录里面所有.sql结尾文件的后缀名
rename 's/\.sql$//' *.sql

22、使用jinfo查看java进程信息:jinfo -flags pid 

jinfo -flags 21528 

 23、让程序等待:sleep

sleep 10:暂停10秒

sleep $[ ${INTERVAL}*${TIMES} ]:根据变量的值进行计算之后进行休眠

 24、本地变量中的只读变量:当前shell有效

readonly abc: 设置变量为只读变量,也不能取消

查看只读变量:readonly, 则显示当前shell下的只读变量

【注意】删除只读变量使用unset -f variable, 但是不能从环境变量中取消指定的变量和函数

 25、环境变量:用于全部的子进程, 通过env进行查看

通过export环境文件/etc/profile或~/.bash_profile来完成的

 26、位置变量

位置变量指的是shell程序在运行时传入的参数。

例如要向shell程序传递参数“Beijing is a beautiful city” 

$0

$1

$2

$3

$4

$5

$6

$7

$8

$9

bash

Beijing

is

a

beautiful

city

 

 

 

 

 27、PS1、PS2

PS1, 终端显示时的命令前面的提示信息;

 [simpleanti@PLATQA136025 ~]$ echo $PS1

[\u@\h \W]\$

  PS2:在命令行下面输入多行时的提示符号

  1. [simpleanti@PLATQA136025 logs]$ for loop in `cat test.txt` 
  2. > do 
  3. > echo $loop 
  4. > done 
  5. abc 
  6. def 
  7. hij 

 28、特殊变量

变量名

含义

$0

shellshell脚本的名字

$*

以一对双引号给出参数列表

$@

将各个参数分别加双引号返回

$#

参数的个数

$_

代表上一个命令的最后一个参数

$$

代表所在命令的PID

$!

代表最后执行的后台命令的PID

$?

代表上一个命令执行后的退出状态

 29、shift变量

由于位置变量最多可以传9个给脚本,但是如果超过9个,则可以考虑shift变量该搞定。 shift n:变量向左边移动n个位置, 即如果传递的a b c, shift 1之后,则传递的参数为b c

  1. echo "no.1:"$1 
  2. echo "no.2:"$2 
  3. echo "no.3:"$3 
  4.  
  5. echo "--------------------------------" 
  6. shift 1 
  7. echo "no.1:"$1 
  8. echo "no.2:"$2 
  9. echo "no.3:"$3 

执行脚本:./test.txt a b c, 则结果为:

  1. [simpleanti@PLATQA136025 logs]$ ./test.txt a b c 
  2. no.1:a 
  3. no.2:b 
  4. no.3:c 
  5. -------------------------------- 
  6. no.1:b 
  7. no.2:c 
  8. no.3: 

 30、双引号

除了$`\三个之外的字符,在双引号内的字符都原样输出

  1. [simpleanti@PLATQA136025 logs]$ echo -e "ert, $SHELL '\n* china `echo ali`" 
  2. ert, /bin/bash ' 
  3. * china ali 

 31、单引号

除了\外,在单引号中的字符原样输出

  1. [simpleanti@PLATQA136025 logs]$ echo -e 'ert, $SHELL \n* china `echo ali`' 
  2. ert, $SHELL  
  3. * china `echo ali` 

 32、历史记录相关:history

 

set | grep HIS

history默认保存1000个,保存在/root/.bash_history

history -c:历史全部清理, 想每次退出的时候清理历史记录,则history -c保存在.bash_logout

!213:执行213号命令(可以从history查到编号)

!!:执行上一条命令

 33、杀掉所有java进程, 杀掉所有其他相关进程类似
ps auxww | grep java | awk '{print $2}' | xargs kill -9
ps -ef | grep [j]ava | awk '{print $2}' | xargs kill -9
 
 不显示自己的进程:
方法1:ps aux | grep app | grep -v "grep"
方法2:ps aux | grep [a]pp
 [a]pp,\[a]pp,\[a\]pp 三个没什么区别,\\[a\\]pp 有区别
  1. 12:45:07 root@ST-TEST:[/]#ps aux | grep [a]pp 
  2. root           0  0.0  0.0  384  320      - A      May 09 70:22 swapper 
  3. 12:45:18 root@ST-TEST:[/]#ps aux | grep vi 
  4. root      692402  0.0  0.0  656  600  pts/1 A    12:44:55  0:00 vi [a]pp  
  5. 12:45:26 root@ST-TEST:[/]#ps aux | grep \[a]pp 
  6. root           0  0.0  0.0  384  320      - A      May 09 70:22 swapper 
  7. 12:45:44 root@ST-TEST:[/]#ps aux | grep \[a\]pp 
  8. root           0  0.0  0.0  384  320      - A      May 09 70:22 swapper 
  9. 12:46:04 root@ST-TEST:[/]#ps aux | grep \\[a\\]pp 
  10. root      692402  0.0  0.0  656   16  pts/1 A    12:44:55  0:00 vi [a]pp  

 34、shell中数组相关的操作

Bash中还可以使用数组变量,其赋值有两种:
(1) name = (value1 ... valuen) 此时下标从0开始
(2) name[index] = value
数组下标的范围没有任何限制,同时也不必使用连续的分量.
--------------------------------------------------
$ A=(a b c def)
==================================================
$ echo ${A[@]} //取全部元素
a b c def
=================================================
$ echo ${A[0]} //取第一个元素
a
=================================================
//取得数组元素的个数
$ echo ${#A[@]}
4
$ echo ${#A
}
4
$ echo ${#A[3]} //取得元素3的长度
$
==================================================
$ A[3]=yaoshuyin //将第三个元素重新赋值
$ echo ${A[@]}
a b c yaoshuyin
==================================================
//清除变量
$ unset A
$ echo ${A[@]}
$
==================================================
//清空变量,即将值变为空
$ A=
$ echo ${A[@]}
$
==================================================
A=B 
B=C 
unset $A 事实上所取消的变量是 B 而不是 A
=======================示例 while循环========================
#建立数组
arrSource=("arrJobs.php" "arrSubHangye.php" "arrFirst.php" )
arrDest=("buildhr" \
"buildtrain/htdocs" \
"bankhr" \
"healthr" \
"elehr" \
)
 
#取数组无元素个数
lenArrSource=${#arrSource
}
lenArrDest=${#arrDest
}
 
#循环列出数组元素
i=0
while [ $i -lt $lenArrSource ]
do
echo ${arrSource[$i]}
let i++
done
 
i=0
while [ $i -lt $lenArrDest ]
do
echo ${arrDest[$i]}
let i++
done
=======================示例: for循环===============================
#源文件
arrSource=("/home/800hr/htdocs/login_jump.php")
#目标网站
arrDest=(ithr elehr buildhr bankhr healthr ctvhr chenhr mechr clothr cneduhr 56hr tourhr foodhr greenhr cnlawhr waimaohr)
 
for outer in ${arrSource
} #${arrSource
} 是数组中的所有元素
do
for inner in ${arrDest
}
do
echo "ln -s $outer /home/${inner}/campus/" 
done
done
 

 35、统计字符串中某个字符出现的个数

 abcdabcd 我想统计b出现的个数

方法1:awk -F'b' '{print NF-1}'

  1. [leonardo@PLATQA129249 ~]$ echo "abcbb" | awk -F'b' '{print NF-1}' 

 

方法2:echo “aoa”|grep -o a|wc-l

统计字符之类的方法算是非常多的, 如
str=abcbddd
str=${str//[^b]}
echo $str
echo $str|awk '{print gsub("b","b")}'

 35、查看系统情况

常用top命令,但是不会显示cache的大小,所以会出现看起来进程使用内存较少,但是总的内容确使用很多的情况。此时需要使用vmstat

top按照内存大小顺序显示如下:

  1. top - 19:47:31 up 62 days,  1:27,  3 users,  load average: 4.77, 3.94, 2.90 
  2. Tasks: 135 total,   1 running, 134 sleeping,   0 stopped,   0 zombie 
  3. Cpu(s): 29.9%us,  5.2%sy,  0.0%ni, 64.4%id,  0.0%wa,  0.1%hi,  0.4%si,  0.0%st 
  4. Mem:  16444080k total, 15435264k used,  1008816k free,   689448k buffers 
  5. Swap:  2096440k total,      160k used,  2096280k free, 12249560k cached 
  6.  
  7.   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                          
  8.  5899 leonardo  20   0 4076m 1.2g  51m S 273.8  7.6  63:52.54 java                                                                                            
  9.  4027 napoli    25   0 1672m 663m 9860 S  0.0  4.1   2:04.12 java    

vmstat使用显示:

  1. [leonardo@inc-153-29 ~]$ vmstat 
  2. procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ 
  3.  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st 
  4.  4  0    160 1030212 689448 12249528    0    0     1     3    1    0  2  1 97  0  0 

 36、 vim黏贴代码格式混乱的解决方法

参考:http://blog.csdn.net/CommShare/archive/2011/03/01/6215088.aspx

 在/etc/vim中,修改vimrc,添加 set pastetoggle=<F9>

在黏贴代码之前,进入insert模式,按F9,就可以关闭自动缩进。
当需要自己手写代码的时候,进入insert模式,默认就是自动缩进了。

 36、VI中粘贴时防止被复制的内容变形

     每次复制代码时,如果代码里有 // 这样的注释就容易让格式乱掉,通过下面的设置就可以避免这种情况。

粘贴代码时取消自动缩进

VIM在粘贴代码时会自动缩进,把代码搞得一团糟糕,甚至可能因为某行的一个注释造成后面的代码全部被注释掉,我知道有同学这个时候会用vi去打开文件再粘贴上去(鄙人以前就是这样),其实需要先设置一下

set paste

然后再进入插入模式粘贴,代码就不会被自动缩进。可是敲代码的时候需要自动缩进,又得改回来:

set nopaste

最方便的方法就是在.vimrc中加一句:

set pastetoggle=<F9>

以后在插入模式下,只要按F9键就可以切换自动缩进。

 
37、VI中翻页操作
翻整页:
   向下翻页 ctrl+f  
   向上翻页 ctrl+b
翻半页:
   向下翻半页 ctrl+d 
    向上翻半页 ctrl+u
 38、Linux下面的词典
词典存放位置:/usr/share/dict/words
 实例1:超过40个字母的单词
  1. [leonardo@PLATQA136019 ~]$ grep '.\{40,\}' /usr/share/dict/words  
  2. pneumonoultramicroscopicsilicovolcanoconiosis 
 实例2:列出以i开头,以n结尾,中间包含18个字符的单词
  1. [leonardo@PLATQA136019 ~]$ grep '^i.\{18\}n$' /usr/share/dict/words  
  2. institutionalisation 
  3. institutionalization 
  4. intercrystallization 
  5. interdifferentiation 
  6. internationalisation 
  7. internationalization 

 实例3:列出apache文件中的有用信息,去除以#开头的注释信息

grep -v '^#' httpd.conf | grep -v '^$'

或者 grep -v "^#" httpd.conf | grep -v "^$"

 39、输入输出重定向

实例1:正确和错误输出到同一文件中

ll abcde > tmp.txt 2>&1

 还可以使用ll abcde &> tmp.txt达到同样的效果

 实例2:正确和错误追加到同一文件中

ll abcde >> tmp.txt 2>&1

 40、列出文件夹

ll | grep '^d'

  1. [leonardo@PLATQA136019 client]$ ll | grep '^d' 
  2. drwxrwxr-x  2 leonardo leonardo    4096  2月 28 10:52 nmon 
  3. drwxrwxr-x  2 leonardo leonardo    4096  2月 23 09:28 Perf-Result 

41、unzip到某个目录下面

unzip -o -d ./dist/ dubbo.registry.server-2.0.2-SNAPSHOT-dist.zip

-o:不提示的情况下覆盖文件

-d:指定解压到某个目录下面, -d ./dist/即为解压到当前目录的dist文件夹下面

 42、MSN消息监控Linux

赶星:http://ganxing.blog.51cto.com/624086/162563

 43、杀掉进程

  1. function killProcess() 
  2.         ps -ef | grep [n]ormandy.server | awk '{print $2}' | xargs kill -9 
  3.         if [ "0" != $? ]; then 
  4.                 echo "The normandy process not exists!!!" 
  5.         else 
  6.                 echo $? 
  7.                 echo "The normandy process killed!!!" 
  8.         fi