您的位置:首页 > 运维架构 > Shell

常用shell实例

2016-03-24 16:41 567 查看
1、找出example.html文件中<开头的行打印行号

grep -n "^<" example.html

1:<html>

10:</html>

awk '/^</{print FNR,$0}' example.html

1 <html>

10 </html>

grep [-acinv] [--color=auto] '搜寻字符串' filename

选项与参数:

-a :将 binary 文件以 text 文件的方式搜寻数据

-c :计算找到 '搜寻字符串' 的次数

-i :忽略大小写的不同,所以大小写视为相同
-n :顺便输出行号

-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行


--color=auto :可以将找到的关键词部分加上颜色的显示

2、cut的使用,只擅长处理“以一个字符间隔”的文本内容,对于多空格不擅长

字节(bytes),用选项-b

字符(characters),用选项-c,作用与-b类似,但在中文字符起作用

域(fields),用选项-f,与-d一起使用,默认为tab键

lsn@lsn:/$ cat /etc/passwd | head -n 3

root:x:0:0:root:/root:/bin/bash

daemon:x:1:1:daemon:/usr/sbin:/bin/sh

bin:x:2:2:bin:/bin:/bin/sh

lsn@lsn:/$ cat /etc/passwd | head -n 3 | cut -b 1-5

root:

daemo

bin:x

lsn@lsn:/$ cat /etc/passwd | head -n 3 | cut -c 1-5

root:

daemo

bin:x

lsn@lsn:/$ cat /etc/passwd | head -n 3 | cut -d : -f 6

/root

/usr/sbin

/bin

lsn@lsn:/$

3、file查看文件类型

file 1.txt 

1.txt: ASCII text

4、sort 排序

lsn@lsn:~$ cat 1.txt

lsn      tty1         2016-03-24 14:44

lsn      pts/1        2016-03-24 14:44 (admin.lan)

lsn      tty1         2016-03-24 14:44

lsn      pts/1        2016-03-24 14:44 (admin.lan)

lsn@lsn:~$ sort 1.txt

lsn      pts/1        2016-03-24 14:44 (admin.lan)

lsn      pts/1        2016-03-24 14:44 (admin.lan)

lsn      tty1         2016-03-24 14:44

lsn      tty1         2016-03-24 14:44

sort命令是帮我们依据不同的数据类型进行排序,其语法及常用参数格式:
sort [-bcfMnrtk][源文件][-o 输出文件] 

补充说明:sort可针对文本文件的内容,以行为单位来排序。

参  数:

  -b   忽略每行前面开始出的空格字符。

  -c   检查文件是否已经按照顺序排序。

  -f   排序时,忽略大小写字母。

  -M   将前面3个字母依照月份的缩写进行排序。

  -n   依照数值的大小排序。

  -o<输出文件>   将排序后的结果存入指定的文件。

  -r   以相反的顺序来排序。
  -t<分隔字符>   指定排序时所用的栏位分隔字符。

  -k  选择以哪个区间进行排序。


ps aux |grep -v USER | sort -nk +4 | tail       # 显示消耗内存最多的10个运行中的进程,以内存使用量排序。如果cpu就+3

5、uniq去重

lsn@lsn:~$ sort 1.txt | uniq

lsn      pts/1        2016-03-24 14:44 (admin.lan)

lsn      tty1         2016-03-24 14:44

6、read 提示用户输入,并将输入赋值给变量。

lsn@lsn:~$ read var:

7、expr 进行数学运算

expr 2 "*" 3 "+" 5

11

8、wc 计算行数、单词数、字符数
wc -lwc 1.txt

4  18 180 1.txt

9、echo 将文字打印到屏幕
echo "110"

110

10、tee 将数据输出到标准输出设备(屏幕) 和文件

lsn@lsn:~$ who | tee 2.txt

lsn      tty1         2016-03-24 14:44

lsn      pts/1        2016-03-24 14:44 (admin.lan)

lsn@lsn:~$ cat 2.txt

lsn      tty1         2016-03-24 14:44

lsn      pts/1        2016-03-24 14:44 (admin.lan)

lsn@lsn:~$

11、basname返回文件名,dirname返回文件的当前路径

lsn@lsn:~$ basename 1.txt

1.txt

lsn@lsn:~$ dirname 1.txt

.

lsn@lsn:~$ pwd

/home/lsn

12、head和tail 打印开头和结尾

13、tr可以对来自标准输入的字符进行替换、压缩和删除
-c或——complerment:取代所有不属于第一字符集的字符; 

-d或——delete:删除所有属于第一字符集的字符; 

-s或--squeeze-repeats:把连续重复的字符以单独一个字符表示; -t或--truncate-set1:先删除第一字符集较第二字符集多出的字符。

例:替换

echo "HELLO WORLD" | tr 'A-Z' 'a-z'

hello world

cat text | tr '\t' ' '  替换制表符为空格

例:删除

echo "hell456o worl789d"| tr -d '0-9'

hello world

例:将不在补集中的所有字符删除

lsn@lsn:~$ echo aa.,a 1 b#$bb 2 c*/cc 3 ddd 4 | tr -d -c '0-9 \n'

 1  2  3  4

14、sed 是一个支持正则表达式的基本查找替换程序。

命令p用于显示模式空间的内容。默认情况下,sed把输入行打印在屏幕上,选项-n用于取消默认的打印操作。当选项-n和命令p同时出现时,sed可打印选定的内容。
在没有-n 的时候,包含模板的行将被打印两次, 但是在使用-n 的时候将只打印包含模板的行。 

例:查找1.txt文件中包含admin的行
lsn@lsn:~$ cat 1.txt

lsn      tty1         2016-03-24 14:44

lsn      pts/1        2016-03-24 14:44 (admin.lan)

lsn      tty1         2016-03-24 14:44

lsn      pts/1        2016-03-24 14:44 (admin.lan)

lsn@lsn:~$ sed '/admin/p' 1.txt

lsn      tty1         2016-03-24 14:44

lsn      pts/1        2016-03-24 14:44 (admin.lan)

lsn      pts/1        2016-03-24 14:44 (admin.lan)

lsn      tty1         2016-03-24 14:44

lsn      pts/1        2016-03-24 14:44 (admin.lan)

lsn      pts/1        2016-03-24 14:44 (admin.lan)

lsn@lsn:~$ sed -n '/admin/p' 1.txt

lsn      pts/1        2016-03-24 14:44 (admin.lan)

lsn      pts/1        2016-03-24 14:44 (admin.lan)

lsn@lsn:~$

打印1到2行

lsn@lsn:~$ sed -n '1,2p' 1.txt

lsn      tty1         2016-03-24 14:44

lsn      pts/1        2016-03-24 14:44 (admin.lan)

逗号,可以选定行的范围

sed -n '/west/,/east/p' datafile

查找datafile文件中west到east之间的行

lsn@linux:~$ sed '/west/,/east/s/$/**VACA**/' datafile

northwest  NW  Charles Main  3.0  .98  3  34 **VACA**

western   WE  Sharon Gray   5.3  .97  5  23 **VACA**

southwest   SW  Lewis Dalsass  2.7  .8  2  18 **VACA**

southern   SO  Suan Chin   5.1  .95  4  15 **VACA**

southeast  SE  Patricia Hemenway 4.0  .7  4  17 **VACA**

eastern   EA  TB Savage   4.4  .84  5  20

northeast  NE  AM Main Jr.   5.1  .94  3  13

north   NO  Margot Weber  4.5  .89  5   9

central   CT  Ann Stephens  5.7  .94  5  13

命令d用于删除输入行

例:删除最后一行,会显示其余行。删除保护admin的行

lsn@lsn:~$ sed '$d' 1.txt

lsn      tty1         2016-03-24 14:44

lsn      pts/1        2016-03-24 14:44 (admin.lan)

lsn      tty1         2016-03-24 14:44

lsn@lsn:~$ sed '/admin/d' 1.txt

lsn      tty1         2016-03-24 14:44

lsn      tty1         2016-03-24 14:44

lsn@lsn:~$

命令s用于替换,g代表全局,可以使用-n和p指定匹配行。也可以将分隔符/替换成其他字符(换行符、反斜线除外)

行末尾的
g 标志表示命令作用的范围是整个行。
也就是说,如果找到多个 admin,它们就都将被替换为 wocao。如果没有 g 标志,则只有每行第一个 admin被替换为 wocao
lsn@lsn:~$ sed 's/admin/wocao/g' 1.txt
lsn      tty1         2016-03-24 14:44
lsn      pts/1        2016-03-24 14:44 (wocao.lan)
lsn      tty1         2016-03-24 14:44
lsn      pts/1        2016-03-24 14:44 (wocao.lan)
lsn@lsn:~$ sed 's#admin#wocao#g' 1.txt
lsn      tty1         2016-03-24 14:44
lsn      pts/1        2016-03-24 14:44 (wocao.lan)
lsn      tty1         2016-03-24 14:44
lsn      pts/1        2016-03-24 14:44 (wocao.lan)
lsn@lsn:~$ sed -n '1,3s/admin/wocao/gp' 1.txt
lsn      pts/1        2016-03-24 14:44 (wocao.lan)
lsn@lsn:~$

&符号表示替换字符串中被找到的部分。

sed 's/[0-9][0-9]$/&.5/' datafile

找到行尾数后两位为数字的在后面追加".5"

命令e是编辑命令,用于sed执行多个编辑任务的情况下。在下一行开始编辑前,所有的编辑动作将应用到模式缓冲区中的行上。执行顺序影响执行结果。
例:

lsn@lsn:~$ sed -e '/tty/d' -e 's/admin/wocao/g' 1.txt

lsn      pts/1        2016-03-24 14:44 (wocao.lan)

lsn      pts/1        2016-03-24 14:44 (wocao.lan)

lsn@lsn:~$ sed -e '1,2d' -e 's/admin/wocao/g' 1.txt

lsn      tty1         2016-03-24 14:44

lsn      pts/1        2016-03-24 14:44 (wocao.lan)

a\ 命令是追加命令,追加将添加新文本到文件中当前行(即读入模式缓冲区中的行)的后面。所追加的文本行位于sed命令的下方另起一行。如果要追加的内容超过一行,则每一行都必须以反斜线结束,最后一行除外。最后一行将以引号和文件名结束。
lsn@lsn:~$ sed '/44$/a\11111111' 1.txt

lsn      tty1         2016-03-24 14:44

11111111

lsn      pts/1        2016-03-24 14:44 (admin.lan)

lsn      tty1         2016-03-24 14:44

11111111

lsn      pts/1        2016-03-24 14:44 (admin.lan)

15、awk 把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

命令行模式

awk [-F  field-separator]  'commands'  input-file(s)
其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。


awk工作流程是这样的:读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是"空白键"
或 "[tab]键",也可以通过-F去指定。


例:默认分隔符为空格

lsn@lsn:~$ last -n 5 | awk '{print $1}'

lsn

reboot

lsn

lsn

lsn

例:通过-f制定为:

lsn@lsn:~$ head -n 5 /etc/passwd | awk -F ':' '{print
$1}'

root

daemon

bin

sys

sync

例:显示1和7域,通过"\t"进行分割

lsn@lsn:~$ head -n 5 /etc/passwd | awk -F ':' '{print
$1"\t"$7}'

root    /bin/bash

daemon  /bin/sh

bin     /bin/sh

sys     /bin/sh

sync    /bin/sync

例:开始和结束流程,制作表格。先执行BEGING,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作。

lsn@lsn:~$ head -n 5 /etc/passwd | awk -F ':' 'BEGIN{print
"name\tshell"}{print $1"\t"$7} END{print "begin\tend"}'

name    shell

root    /bin/bash

daemon  /bin/sh

bin     /bin/sh

sys     /bin/sh

sync    /bin/sync

begin   end

例:类似grep用法,匹配查找字符用//括起来。

lsn@lsn:~$ awk -F: '/root/' /etc/passwd

root:x:0:0:root:/root:/bin/bash

lsn@lsn:~$ awk -F: '/root/{print $1"\t"$7}' /etc/passwd

root    /bin/bash

awk内置变量

ARGC               命令行参数个数

ARGV               命令行参数排列

ENVIRON            支持队列中系统环境变量的使用

FILENAME           awk浏览的文件名

FNR                浏览文件的记录数

FS                 设置输入域分隔符,等价于命令行 -F选项

NF                 浏览记录的域的个数

NR                 已读的记录数

OFS                输出域分隔符

ORS                输出记录分隔符

RS                 控制记录分隔符

例:

lsn@lsn:~$ awk  -F ':'  '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd

filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash

filename:/etc/passwd,linenumber:2,columns:7,linecontent:daemon:x:1:1:daemon:/usr/sbin:/bin/sh

filename:/etc/passwd,linenumber:3,columns:7,linecontent:bin:x:2:2:bin:/bin:/bin/sh

filename:/etc/passwd,linenumber:4,columns:7,linecontent:sys:x:3:3:sys:/dev:/bin/sh

例:使用printf更加简洁

awk  -F ':'  '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: