常用shell实例

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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Shell脚本高级编程教程,希望对你有所帮助。 Example 10-23. Using continue N in an actual task: 1 # Albert Reiner gives an example of how to use "continue N": 2 # --------------------------------------------------------- 3 4 # Suppose I have a large number of jobs that need to be run, with 5 #+ any data that is to be treated in files of a given name pattern in a 6 #+ directory. There are several machines that access this directory, and 7 #+ I want to distribute the work over these different boxen. Then I 8 #+ usually nohup something like the following on every box: 9 10 while true 11 do 12 for n in .iso.* 13 do 14 [ "$n" = ".iso.opts" ] && continue 15 beta=${n#.iso.} 16 [ -r .Iso.$beta ] && continue 17 [ -r .lock.$beta ] && sleep 10 && continue 18 lockfile -r0 .lock.$beta || continue 19 echo -n "$beta: " `date` 20 run-isotherm $beta 21 date 22 ls -alF .Iso.$beta 23 [ -r .Iso.$beta ] && rm -f .lock.$beta 24 continue 2 25 done 26 break 27 done 28 29 # The details, in particular the sleep N, are particular to my 30 #+ application, but the general pattern is: 31 32 while true 33 do 34 for job in {pattern} 35 do 36 {job already done or running} && continue 37 {mark job as running, do job, mark job as done} 38 continue 2 39 done 40 break # Or something like `sleep 600' to avoid termination. 41 done 42 43 # This way the script will stop only when there are no more jobs to do 44 #+ (including jobs that were added during runtime). Through the use 45 #+ of appropriate lockfiles it can be run on several machines 46 #+ concurrently without duplication of calculations [which run a couple 47 #+ of hours in my case, so I really want to avoid this]. Also, as search 48 #+ always starts again from the beginning, one can encode priorities in 49 #+ the file names. Of course, one could also do this without `continue 2', 50 #+ but then one would have to actually check whether or not some job 51 #+ was done (so that we should immediately look for the next job) or not 52 #+ (in which case we terminate or sleep for a long time before checking 53 #+ for a new job).

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值