Linuxl下C编程系列--Shell(续)

原创 2007年09月24日 16:53:00

shell的输入与输出主要包括:
echo命令
read命令
cat命令
管道
tee命令
标准输入、输出和标准错误
重定向


echo [-e] [-n]  string
string : 字符串,可以含 shell 变量、转义符等,  一般用双引号括起来
-e :  让 echo 解释 string 中的转义符
-n :  禁止 echo 输出后输出 NEWLINE(换行)

cat [-n][-b][-t][-e] file1 file2 ...
cat 是一个简单而通用的命令,可以用它来显示文件内容,创建文件,还可以用它来显示控制字符
-n : 显示行号
-b : 显示行号(不含空行)
-t : 显示制表符
-e : 显示行结束符
创建文件:
cat file1 file2 > newfile 合并文件
cat > newfile 输入文本,按 ctrl+d  结束输入

管道
| : 把一个命令的输出传递给另一个命令作为输入。
例:ls –l | grep ^d

tee 命令
把输出的一个副本输送到标准输出,另一个副本拷贝到相应的文件中。
tee [-a] filename 
-a : 追加到文件末尾
tee 命令一般与管道结合使用
例:ls  | tee list.out

grep:

不会对输入文件进行任何修改或影响
grep家族:grep,egrep,fgrep
形式:
grep [选项] pattern file1 file2 ...

pattern:可以是正则表达式(用单引号括起来)、                             或字符串(加双引号)、或一个单词。
 file1 file2 ... :文件名列表,作为 grep 命令的输入;grep 的输入也可以来自标准输入或管道;

可以把匹配模式写入到一个文件中,每行写一个,然后使用 -f 选项,将该匹配模式传递给 grep 命令。
grep -f patternfile file1 file2 ...
常用选项:
-c 只输出匹配的行的总数
-i 不区分大小写
-h 查询多个文件时,不显示文件名
-l 查询多个文件时,只输出包含匹配模式的文件的文件名
-n 显示匹配的行及行号
-v 反向查找,即只显示不包含匹配模式的行
-s 不显示错误信息

例:
1.查询多个文件,可以使用通配符 “ * ”
 如:grep "math2"  *.txt
 grep "12"  *
2.反向匹配
 ps aux | grep "ssh" | grep –v "grep"
3.匹配空行
 grep -n '^$' datafile
 grep -v '^$' datafile > datafile2
4.精确匹配单词: /< 和 />
 找出所有包含 以 north 开头 的单词的行
 grep '/<north' datafile
 找出所有包含 以 west 结尾 的单词的行
 grep 'west/>' datafile
 找出所有包含 north 单词的行
 grep '/<north/>' datafile
5.递归搜索目录中的所有文件:-r
grep -r "north" datafile  ~/Teaching/linux/
6.关于某个字符连续出现次数的匹配
grep 'o/{2,/}'  helloworld
'o/{2,4/}' , 'o/{2,4/}' , 'lo/{2,4/}'


流编辑器sed
sed 是一个精简的、非交互式的编辑器,它在命令行中输入编辑命令和指定文件名,然后在屏幕上查看输出。
sed如何工作的:
sed 逐行处理文件(或输入),并将输出结果发送到屏幕。
即:sed 从输入(可以是文件或其它标准输入)中读取一行,将之拷贝到一个编辑缓冲区,按指定的 sed 编辑命令进行处理,编辑完后将其发送到屏幕上,然后把这行从编辑缓冲区中删除,读取下面一行。重复此过程直到全部处理结束。
sed 只是对文件在内存中的副本进行操作,所以 sed 不会修改输入文件的内容。sed 总是输出到标准输出,可以使用重定向将 sed 的输出保存到文件中。

三种调用方式:
1.在命令行中直接调用
2.将sed命令插入脚本文件,然后调用
3.将sed命令插入到脚本文件,生成sed可执行脚本,在命令行中直接键入脚本名

常见的 sed 编辑命令小结:
 p 打印匹配行 s 替换命令
 = 显示匹配行的行号 l 显示指定行中所有字符
 d 删除匹配的行 r 读文件
 a/ 在指定行后面追加文本 w 写文件
 i/ 在指定行前面追加文本 n 读取指定行的下面一行
 c/ 用新文本替换指定的行 q 退出 sed

在 sed_cmd 中可以使用 shell 变量,此时应使用 双引号。

一些 sed 行命令集:
 '/north/p' 打印所有包含 north 的行
 '/north/!p' 打印所有不包含 north 的行
 's//.$//g' 删除以句点结尾的行中末尾的句点
 's/^  *//g' 删除行首空格(命令中 ^  * 之间有两个空格)
 's/  */ /g' 将连续多个空格替换为一个空格
   命令中 */ 前有三个空格,后面是一个空格
 '/^$/d’ 删除空行
 's/^.//g' 删除每行的第一个字符,同 's/.//'
 's/^/%/g' 在每行的最前面添加百分号 %
 '3,5s/d/D/' 把第 3 行到第 5 行中每行的 第一个 d 改成 D

 

awk:
awk 是一种用于处理数据和生成报告的编程语言
 awk 可以在命令行中进行一些简单的操作,也可以被写成脚本来处理较大的应用问题
 awk 与 grep、sed 结合使用,将使 shell 编程更加容易

awk如何工作的:
awk 逐行扫描输入 ( 可以是文件或管道等 ),按给定的模式查找出匹配的行,然后对这些行执行 awk 命令指定的操作

也有类似的三种使用方式。

awk的执行过程:
①  如果存在 BEGIN ,awk 首先执行它指定的 actions
② awk 从输入中读取一行,称为一条输入记录
③ awk 将读入的记录分割成数个字段,并将第一个字段放入变量     $1 中,第二个放入变量 $2 中,以此类推;$0 表示整条记录;    字段分隔符可以通过选项 -F 指定,否则使用缺省的分隔符。
④ 把当前输入记录依次与每一个 awk_cmd 中 pattern 比较:     如果相匹配,就执行对应的 actions;     如果不匹配,就跳过对应的 actions,直到完成所有的 awk_cmd
⑤ 当一条输入记录处理完毕后,awk 读取输入的下一行,重复上    面的处理过程,直到所有输入全部处理完毕。
⑥ awk 处理完所有的输入后,若存在 END,执行相应的 actions
⑦ 如果输入是文件列表,awk 将按顺序处理列表中的每个文件。

awk 中正则表达式中常用到的元字符有:
^ 只匹配行首 ( 可以看成是行首的标志 )
$ 只匹配行尾 ( 可以看成是行尾的标志 )
* 一个单字符后紧跟 *,匹配 0个或多个此字符
[ ] 匹配 [] 内的任意一个字符 ( [^] 反向匹配 )
/ 用来屏蔽一个元字符的特殊含义
. 匹配任意单个字符
str1|str2 匹配 str1 或 str2
+ 匹配一个或多个前一字符
? 匹配零个或一个前一字符
( ) 字符组
 Linux 下使用的 awk 是 gawk


操作由一条或多条语句或者命令组成,语句、命令之间用分号 “ ; ” 隔开。操作中还可以使用流程控制结构的语句
awk 命令:
 print 输出列表:打印字符串、变量或表达式,输出列表中各参数之间用逗号隔开;若用空格隔开,打印时各输出之间没有空格
 printf ( [格式控制符], 输出列表 ) :格式化打印,语法与 C语言中的 printf 函数类似
 next:停止处理当前记录, 开始读取和处理下一条记录
 nextfile:强迫 awk 停止处理当前的输入文件而处理输入文件列表中的下一个文件
 exit:使 awk 停止执行而跳出。若存在 END 语句,则执行 END 指定的 actions

为了避免碰到 awk 错误,要注意以下事项:
 确保整个 awk_script 用单引号括起来
 确保 awk_script 内所有引号都成对出现
 确保用花括号括起动作语句,用圆括号括起条件语句
 如果使用字符串,要保证字符串被双引号括起来 ( 在模式中除外 )

 awk 语言学起来可能有些复杂,但使用它来编写一行命令或小脚本并不太难。awk 是 shell 编程的一个重要工具。在shell 命令或编程中,可以使用 awk 强大的文本处理能力 

Linuxl下C编程系列--Shell

shell脚本(.sh):类似windows下的批处理bat.文件比批处理强大,已经是一强大的编程语言了。echo "please enter your name:";read fname;echo ...
  • Image_Graphics
  • Image_Graphics
  • 2007年08月09日 11:39
  • 881

Linuxl下C编程系列--基础知识及基本命令

Linux下C开发编辑器:VI编译器:选择GNU C/C++编译器gcc调试器:应用广泛的gdb函数库:glibc系统头文件:glibc_header若想开发图形界面,还需选上GNOME(c)/KDE...
  • Image_Graphics
  • Image_Graphics
  • 2007年08月09日 11:38
  • 1168

C shell编程笔记

我总结的C Shell编程语法小手册。如果很长一段时间不用忘了语法但是突然要编写脚本时可以进行参考~...
  • Hipercomer
  • Hipercomer
  • 2013年07月07日 11:17
  • 5925

添物零基础到大型全栈架构师 不花钱学计算机及编程(预备篇)— C语言编程基础

C语言介绍 C语言基本是每个编程人员必学的一面语言,很好掌握,是理解编程的关键。很多编程语言基于其编写或者基于此语言的衍生品编写。 C语言是人机交互的一个基础语言之一,虽然是之一,单一般其...
  • longronglin
  • longronglin
  • 2016年06月27日 12:54
  • 833

shell 编程学习---续

     在学习之前先介绍下CGYWIN,这是一个模拟unix命令的软件,对于那些想学unix或linux而有不想装linux系统的人来说是一个不错的选择!     让我们用一个简单的脚本来开始我们的...
  • sheperd_shu
  • sheperd_shu
  • 2009年03月21日 18:27
  • 254

shell初级编程(续)

功能:首先创建用户组,然后创建30个用户个用户目录,并赋予相应权限#!/bin/bash i=1 groupadd testgroup while [ $i -le 30 ];do if [ $i ...
  • yming0221
  • yming0221
  • 2011年07月07日 22:14
  • 1628

网络编程--JAVA之多线程下载后续:断点续存

这篇博客就是接在我上篇博客网络编程–JAVA之多线程下载的基础上来实现的。首先,我来说一下断点续存能解决啥问题: 假如当我们在进行MP4下载时,如果突然出现人为的中断或者意外的中断,那么当我们再次...
  • qq_16293247
  • qq_16293247
  • 2016年06月02日 14:14
  • 1107

shell与C语言

Shell 命令解析器 首行 #! /bin/bash 或#! /bin/sh 首行告知用什么解析,是固定用法 echo 是输出命令 $#   参数个数 #*   所有参数值 $...
  • jiangxiay
  • jiangxiay
  • 2017年10月13日 23:09
  • 117

C Shell教程(打包下载)

C Shell教程,Very Good!!!http://chifeng.cosoft.org.cn/downloads/cshell.rar2004/09/30
  • chifeng
  • chifeng
  • 2004年09月30日 14:18
  • 2709

UNIX编程(一) C语言实现一个模仿bash的shell实现

前言:作为天津大学软件学院的操作系统课程的一个简单的UNIX编程的需作业,需要的知识并不多。 - C语言基础 - 宏定义相关知识 - POSIX代码库 - READLINE代码库(选)基本功能...
  • qq_24451605
  • qq_24451605
  • 2015年10月23日 17:41
  • 2138
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章: Linuxl下C编程系列--Shell(续)
举报原因:
原因补充:

(最多只允许输入30个字)