Shell程序设计 曙光信息产业股份有限公司.

Slides:



Advertisements
Similar presentations
Linux 环境及 Shell 程序 操作系统实验 1. 二、 Shell 编程与进程通信 常用 shell 命令 文件及文件属性操作 ls 、 cp 、 mv 、 rm ln 、 ln –s 、 chmod 、 groupadd 、 useradd 输入输出操作 echo 、 cat >> 、
Advertisements

第 4 章 PHP 基本語法.
上課教材 Database Slide Windows筆電 (32 bit)
C语言程序设计 主讲教师 :张群燕 电话:
第七章 操作系统接口 7.1 联机用户接口 7.2 Shell命令语言 7.3 系统调用 7.4 UNIX系统调用 7.5 图形用户接口.
UNIX的程序與工作控制 程序的定義與特性 程序的建立 相關指令 背景執行 調整程序優先權 signal與kill 工作控制
Linux 的檔案管理.
编译原理上机实习
第4章 JavaScript脚本语言基础 4.1 JavaScript简介 4.2 JavaScript语法基础
LINUX 环境下程序开发基础 曙光用户培训课程系列 课程时间:1.5小时 更新日期:2008年3月.
補充: Input from a text file
Chapter 4 流程控制.
UNIX系統與資料庫安裝 Why UNIX 常用的工具程式介紹 資料庫的安裝.
第一讲:Linux基础培训.
System Administration Practice Homework 2: Shell Programming
Ch07 PHP程式基礎 網頁程式設計.
Linux 的進階檔案處理.
Confidential Property
Vi 編輯器的練習的說明 因為本課程的實習課是Unix 的工作環境。過去的經驗告訴我,如果你完全未用過Unix 的指令及其 vi 編輯器,你將很難跟上進度,希望學員一定要預先作練習。我們提供了Unix 指令的簡介,以及 vi 編輯器的介紹 ( 請参閱網站中的13&14-unix.pdf 為其講義;13-unix.exe、14-fortran.exe則為其課程錄影.
NUIST HPC使用讲座 ——代码调试 刘建宇
第三讲 shell 程序设计.
第 2 章 上機使用 Unix/Linux 內容: 操作介面 主機連線 登入主機 認識系統環境 使用者常用命令.
台灣大學計算機及資訊網路中心 教學研究組 張傑生
Visual Basic 6.0 學習範本 第三章 基本資料型態.
C++Primer 3rd edition 中文版 Chap 5
Python入门培训演示 系统测试部 叶华 文件级别:公开
PHP 5 入門基礎 第一個PHP 程式 PHP 資料型態.
第7章:文件共享 与远程控制——回顾 第8章:bash脚本编程 本章教学目标: 了解shell程序的基本结构 网络文件系统NFS的概念
Shell Script 程式設計.
第五章 shell 编程 shell 编程的基本过程分为三步: 1. 建立 shell 文件 包含任意多行操作系统命令或shell命令的文本
Linux 基础与常用命令简介 生物信息学培训班 杭州,2018年1月18日 周银聪.
C 程式設計— 控制敘述 台大資訊工程學系 資訊系統訓練班.
本單元介紹何謂變數,及說明變數的宣告方式。
第二天 计算机基础技能培训 (一)linux基础知识
1 Introduction Prof. Lin-Shan Lee TA: Chun-Hsuan Wang.
第三章 词法分析.
曙光集群简明使用手册 技术支持中心.
第4章 程序控制结构与算法基础.
新觀念的 VB6 教本 第七章 讓程式轉彎的控制敘述.
Linux基本操作 程設實習課 ( 2/25 ).
本章中將會更詳細地考慮有關重複的概念,並且會 介紹for和do…while等兩種用來控制重複的敘述 式。 也將會介紹switch多重選擇敘述式。 我們會討論直接和迅速離開某種控制敘述式的 break敘述式,以及用來跳過重複敘述式本體剩餘 部份的continue敘述式。 本章會討論用來組合控制條件的邏輯運算子,最後.
第12章 shell编程基础 本章主要介绍shell编程的基础知识。shell脚本的执行类似于Linux下的任何其他命令,脚本可以包含复杂的逻辑,也可以包含一系列Linux命令行指令。在一个shell程序内可以运行其他shell脚本。通过本章的学习,读者可以学到如何使用bash(最流行的Linux.
進階 WWW 程式設計 -- PHP 語言結構 靜宜大學資訊管理學系 蔡奇偉副教授 2003
雲端計算.
檔案類型介紹 Linux 的檔案類型 目錄: 用ls –F時檔名後面有/,螢幕列出目錄時為藍色 可執行檔: 壓縮檔: 連結檔:
第二章 UNIX系统安装与常用命令.
第六章 shell 程序调试 一. 程序执行状态跟踪 程序: -n 读取命令, 但不执行. 主要用于跟踪程序流程是
如何有效率的學習Linux 培養組合能力 多用程式, 少寫程式 從錯誤訊息中學習 養成略讀 “各種文件” 加強英文基本閱讀能力 勤作筆記
Confidential Property
第二章 流编辑器sed 一. 什么是流编辑器? 流编辑器是一种流水线型的、非交互式
第六章 Shell基础.
UNIX指令-檔案與目錄操作.
C语言环境配置.
杨振伟 清华大学 第一讲:Linux环境下编程(1)
实验一:编译运行Linux内核并使用gdb进行调试
本节内容 Lua基本语法.
Lab01 工作站&Linux操作 日期:2011/03/07.
1.3操作系统提供的服务和用户接口 操作系统提供的用户接口 程序接口与系统调用 操作接口与系统程序
台灣大學計算機及資訊網路中心 教學研究組 張傑生
如何連上工作站 WorkStations: 1. Solaris 2. Linux Use X-Win32 (for Solaris)
程序管理 蘇偉順助教.
第1章 数据结构基础概论 本章主要介绍以下内容 数据结构研究的主要内容 数据结构中涉及的基本概念 算法的概念、描述方法以及评价标准.
实验二:添加Linux系统调用及熟悉常见系统调用
粒子物理与核物理实验中的数据分析 杨振伟 清华大学 第1讲:Linux环境下的编程.
杨振伟 清华大学 第一讲:Linux环境下编程(1)
第6章 PHP基本語法介紹.
C语言基本语句 判断循环.
劉庠宏、林合治編著 國立高雄大學應用數學系 2005年3月1日
Presentation transcript:

Shell程序设计 曙光信息产业股份有限公司

提纲 Shell简介 Bash编程基础 常用字符处理工具介绍

什么是Shell? hardware 命令解释器 程序设计语言 脚本(Scripting) Shell Applications Kernel Shell Applications 命令解释器 程序设计语言 脚本(Scripting)

为什么要学习Shell? Shell是Linux的用户接口 简单易用的命令组合完成复杂任务 强大的综合处理功能 一生受用好工具 ...

Shell有哪些种类? /bin/csh (c-like shell)‏ /bin/ksh (kornshell, by AT&T Bell LAB)‏ /bin/tcsh (enhanced csh, FreeBSD default login shell)‏ /bin/bash (bourne-again shell)‏ /bin/dash ... 当前系统安装的Shell可以通过 cat /etc/shells 查看 用户的默认登录Shell可以通过 cat /etc/passwd 查看 tom:x:500:500:tom:/home/tom:/bin/bash

提纲 Shell简介 Bash编程基础 常用字符处理工具介绍

Bash Shell 发展历史: AT & T 设计Unix 时设计了Bourne Shell; Bash: Bourne Again Shell, GNU Project 大多数Linux发行版的默认Shell;

Bash的内部命令 Bash集成了一些内部命令,组成基本操作环境 常用的内部命令: :(true) .(source) alias bg bind builtin cd declare dirs disown echo enable eval exec exit export fc fg getopts hash help history jobs kill let local logout popd pushd pwd read readonly return set shift stop suspend test times trap typest ultimit umask unalias unset wait 循环分支控制相关: if else elif fi for do done case while until continue break

Bash的初始化脚本 通常在这些脚本中进行自定义设置,比如一些程序的环境变量等 /etc/profile /etc/bashrc ˜/.bash profile ˜/.bash login ˜/.bashrc ˜/.profile

Bash的执行方式(交互式) Linux终端登录后,即进入交互式的执行环境 可以执行内部及外部命令 foo@localhost> ls a.txt b.txt c.txt foo@localhost> hostname localhost 后台执行: command & foo@localhost> sleep 300 &

Bash的执行方式(脚本方式) 脚本执行方式,将Bash语句写在文本文件中,批量执行 #开头表示注释 不开启子Shell,在当前Shell中运行: foo@localhost> source test.sh foo@localhost> . test.sh foo@localhost> eval `cat test.sh` 在新的子Shell中运行: foo@localhost> bash -c 'commands' foo@localhost> bash test.sh foo@localhost> ./test.sh (脚本文件以#!/bin/bash开头,且具有可执行权限)

Bash命令的组合方式 不同的命令可分行放置,也可以用分号隔开 #!/bin/bash cd subdir1 rm a.txt foo@localhost> cd /home/foo/subdir2; rm b.txt

Bash命令的组合方式(逻辑组合) 管道线分隔符 command1 && command2 (前者执行成功才执行后者) foo@localhost> cd /home/foo && rm b.txt foo@localhost> cd /home/foo || echo "dir does not exist!"

Bash命令的组合方式(命令集合) 命令集合 { commands; } 命令集合,在当前Shell执行,注意{}前后的空格和分号 foo@localhost> { cd /home/foo; rm a.txt; } foo@localhost> (cd /home/foo; rm a.txt)

Bash的别名设置(alias) 可以定义一些命令的别名,方便使用,别名设置可以放在Bash的初始化脚本中自动加载 foo@localhost> alias ll='ls -l --color=tty' foo@localhost> alias ll alias ll='ls -l --color=tty' foo@localhost> alias rm='rm -i' foo@localhost> unalias ll 取消别名

Bash的变量 变量申明、查看、清除 var=value #注意=号前后无空格 echo $var unset var foo@localhost> var1=abc foo@localhost> echo $var1 abc foo@localhost> unset var1 (无输出)

Bash的变量(系统变量) 常用系统变量: foo@localhost> echo $SHELL /bin/bash HOSTNAME TERM PATH HOME PWD SHELL ... foo@localhost> echo $SHELL /bin/bash foo@localhost> echo $HOME /home/foo

Bash的变量(全局变量) 全局变量(子Shell会继承) export var=value foo@localhost> export var1=abc foo@localhost> var2=123 foo@localhost> export var2 foo@localhost> bash -c 'echo $var1 $var2' abc 123

Bash的变量(特殊变量) foo@localhost> cat test.sh #!/bin/bash $? 前一个命令的退出状态,正常退出返回0,异常退出返回非0值 $# 脚本或函数位置参数的个数 $0 脚本或函数的名称 $1, $2, ... 传递给脚本或函数的位置参数 $* 以”$1 $2...”的形式保存所有输入的命令行参数 $@ 以“$1”“$2”...的形式保存所有输入的命令行参数 foo@localhost> cat test.sh #!/bin/bash echo "The command is $0 $1 $2" foo@localhost> ./test.sh arg1 arg2 The command is test.sh arg1 arg2

Bash的变量(特殊变量) foo@localhost> ls a.txt b.txt foo@localhost> echo $? foo@localhost> ls c.txt ls: cannot access c.txt: No such file or directory 2

Bash的通配符 通配符 * 配任何字符串,包括空字符串 ? 匹配任何单个字符 [] 按照字符范围或列表匹配 * 配任何字符串,包括空字符串 ? 匹配任何单个字符 [] 按照字符范围或列表匹配 {...,...} 按照字符串列表匹配 \ 转意符,使元字符失去其特殊的含义 foo@localhost> ls *.txt foo@localhost> ls A0?.txt foo@localhost> ls [A-Z,a-z][0-9].txt foo@localhost> ls [!a-z]*.txt foo@localhost> ls abc.{txt,tar,dat} foo@localhost> echo \*

Bash的命令替换 命令替换:把命令的输出结果字符串直接替换进来 `commands` 注意是反引号,不是单引号 $(commands) foo@localhost> echo `date` Sun Jan 9 15:38:00 2011 foo@localhost> files=`ls` foo@localhost> currentdir=$(pwd)

Bash的变量参数替换 ${variable-default} 如果变量没有定义,则返回默认值 注意: 变量定义成空字符串也算定义 foo@localhost> echo $username 无输出 foo@localhost> echo ${username-`whoami`} foo

Bash的变量参数替换(续1) ${variable=default} 如果变量没有定义,返回默认值,且赋值给变量 foo@localhost> echo $username 无输出 foo@localhost> echo ${username=`whoami`} foo

Bash的变量参数替换(续2) ${variable+value} 如果变量已经定义,返回+号后给定值,如果没有,返回空 ${variable?msg} 如果变量已经定义,返回变量本身,如果没有,打印给定msg

Bash的变量字符串操作(子串提取) ${#string} 返回字符串的长度 ${string:position} 提取从指定位置开始的子串 ${string:position:length} 提取从指定位置开始的定长子串 foo@localhost> string=01234 foo@localhost> echo ${#string} 5 foo@localhost> echo ${string:2} 234 foo@localhost> echo ${string:2:2} 23

Bash的变量字符串操作(子串剪裁) ${string#substring} 裁去从左边最短匹配子串 如果子串不匹配,不做裁剪操作 foo@localhost> string=abc.txt foo@localhost> echo ${string#abc} .txt foo@localhost> echo ${string%.*} abc

Bash的变量字符串操作(子串替换) ${string/substring/replace} 替换第一处匹配 如果子串不匹配,不做裁剪操作 foo@localhost> string=black-black foo@localhost> echo ${string/black/white} white-black foo@localhost> echo ${string//black/white} white-white

Bash的变量数组(Array) 赋值: array[0]=value1 array[1]=value2 ... 或者一次性赋值: array=(value1 value2 ...) 元素引用: ${#array[*]} 变量元素个数 ${array[0]} 某个变量值 ${array[*]} 全部变量值 foo@localhost> array=(dog fish cat) foo@localhost> echo ${#array[*]} 3 foo@localhost> echo ${array[*]} dog fish cat foo@localhost> echo ${array[0]} dog

Bash的终端控制(输入输出重定向) < 重定向stdin到文件 > 重定向stdout到文件(新建或覆盖) Linux 默认的三个I/O 通道: stdin(标准输入,文件描述符:0) – 默认是键盘 stdout(标准输出,文件描述符:1) – 默认是终端 stderr(标准错误,文件描述符:2) – 默认是终端 < 重定向stdin到文件 > 重定向stdout到文件(新建或覆盖) >> 重定向stdout到文件(追加) 2> 重定向stderr到文件(新建或覆盖) 2>> 重定向stderr到文件(追加) 2>&1 重定向stderr到stdout >& 重定向stdout和stderr到文件

Bash的终端控制(输出重定向) foo@localhost> ls *.{txt,dat} ls: cannot access *.txt: No such file or directory a.dat b.dat foo@localhost> ls *.{txt,dat} >/tmp/ls.out foo@localhost> cat /tmp/ls.out foo@localhost> ls *.{txt,dat} >/tmp/ls.out 2>/tmp/err.out foo@localhost> cat /tmp/err.out

Bash的终端控制(输入重定向) 命令的输入定向到文件,而不是从键盘输入 foo@localhost> tr 'a-z' 'A-Z' </etc/hosts foo@localhost> tr 'a-z' 'A-Z' </etc/hosts >result.log

Bash的终端控制(重定向到特殊文件) 可以重定向到特殊字符设备文件 e.g. foo@localhost> ls >result.log 2>/dev/null 注:Linux下常用的特殊字符设备文件: /dev/null ——“空文件”或“黑洞文件”,丢弃一切写入的内容 /dev/zero —— 永远提供NULL空字符

Bash的终端控制(管道符) 管道符pipe(|),将命令的输出定向到下一条命令的输入 foo@localhost> ls /usr/lib | less foo@localhost> cut -f1 -d: /etc/passwd | sort -r | less foo@localhost> cut -f1 -d: /etc/passwd | sort -r > result.log

Bash读入变量(read) 使用内部命令read,可以从终端读入Shell变量 与C语言的scanf()类似 格式:read [-p 提示字符] var1 [var2] foo@localhost> cat read_test.sh #!/bin/bash read name age echo $name is $age years old. foo@localhost> ./read_test.sh 输入Bob 17,按Ctrl-d Bob is 17 years old. foo@localhost> echo Bob 17 | ./read_test.sh

Bash中的引号 单引号屏蔽所有特殊字符 foo@localhost> echo '$HOME' $HOME /home/foo foo@localhost> echo " '$HOME' " '/home/foo' foo@localhost> echo " \"$HOME\" " "/home/foo"

Bash中的数学运算(内部命令) 内置命名 let 或 ((...)),只能用于整型运算 foo@localhost> echo $(( (1+1)*(2*2) )) 8 foo@localhost> a=1 foo@localhost> ((a+=1)) foo@localhost> echo $a 2 foo@localhost> let a+=1

Bash中的数学运算(外部命令) 调用外部命令expr,只能用于整型运算 foo@localhost> expr \( 1 + 1 \) \* \(2 \* 2 \) 8 foo@localhost> a=`expr 1 + 1` foo@localhost> echo $a 2 注意括号和运算符前后有空格

Bash中的数学运算(外部命令) 调用外部命令bc,可用于浮点运算,功能强大 foo@localhost> echo '1.2*1.2' | bc -l 1.44 foo@localhost> echo "ibase=10; obase=2; 10" | bc 1010

Bash中的逻辑判断 内部命令test,可用于数字比较、字符串比较、文件状态检查、逻辑判断等。语法: test condition 或 foo@localhost> test 1 == 1; echo $? foo@localhost> [ 1 == 2 ]; echo $? 1

Bash中的逻辑判断(字符串比较) =或== 两个字符串相等 != 两个字符串不等 -z 空字符串 -n 非空字符串 =或== 两个字符串相等 != 两个字符串不等 -z 空字符串 -n 非空字符串 =~ 与正则表达式regex进行比较 foo@localhost> str="abc" foo@localhost> [ "$str" = "abc" ] && echo "true" true foo@localhost> [ -z "$str" ] && echo "true" 无输出

Bash中的逻辑判断(整数比较) -eq或== 两个整数相等 -ne或!= 两个整数不等 -gt或> 前者大于后者 -ge或>= 前者大于等于后者 -lt或< 前者小于后者 -le或<= 前者小于等于后者 foo@localhost> var=1 foo@localhost> [ $var >= 1 ] && echo "true" true foo@localhost> [ $var < 0 ] && echo "true" 无输出

Bash中的逻辑判断(文件状态判断) -d 所判断文件是一个目录 -f 正规文件(Regular file) -L 符号链接 -r Readable(文件、目录可读) -w Writable(文件、目录可写) -x Executable(文件可执行、目录可浏览) -u 文件有suid 权限标志 -s 文件长度大于0,非空 -z 文件长度等于0 foo@localhost> file=/etc/hosts foo@localhost> [ -r $file ] && echo "read permission OK" read permission OK

Bash中的逻辑判断(逻辑操作符) condition1 -a condition2 逻辑与 condition1 -o condition2 逻辑或 ! condition 逻辑取非 foo@localhost> a=2; b=3 foo@localhost> [ $a > 1 -a $b > 1 ] && echo "true" true foo@localhost> [ ! $a > 1 ] && echo "true" 无输出

Bash中的分支判断(if语句) if condition_judgement then ... fi elif condition_judgement2 else fi if condition_judgement then ... else fi

Bash中的分支判断(if语句) #!/bin/bash if [ $1 > 1 ] then 举例: #!/bin/bash if [ $1 > 1 ] then echo "Greater than 1" elif [ $1 < 1 ] echo "Less than 1" else echo “Equals to 1" fi #!/bin/bash if cd /tmp/test &>/dev/null then echo “Entering dir succeeds" fi 条件判断也可以是命令,执行成功表示真

Bash中的分支判断(case语句) case expression in pattern1) ...;; pattern2) ... patternn) esac case expression in pattern1) ...;; pattern2) ... patternn) *) esac

Bash中的分支判断(case语句) #!/bin/bash case $1 in apple) 举例: #!/bin/bash case $1 in apple) echo "You choose apple";; grape) echo "You choose grape";; *) echo “I have only apple and grape";; esac

Bash中的循环控制(for循环) for var in value_list do ... done for ((var=0; var<=10; var++)) do ... done

Bash中的循环控制(for循环) for name in tom bob cindy do echo $name done 举例: for name in tom bob cindy do echo $name done for i in `seq 1 10` do ssh node$i date done 变量取值也可以来自其它命令的输出 for ((i=0; i<=10; i++)) do echo $i done

Bash中的循环控制(while循环) while condition_judgement do ... done 条件判断可以是: test 或 [ .. ] 语句 其它命令,判断其执行成功与否 true 或 : (Bash的内部命令,代表真,使得while成为无限循环)

Bash中的循环控制(while循环) COUNTER=0 举例一: COUNTER=0 # If COUNTER < 5, program will print the value of it. while [ "$COUNTER" < 5 ] do COUNTER=$((COUNTER+1)) echo $COUNTER done

Bash中的循环控制(while循环) NUMBER=0 while [ "$NUMBER" != "9" ]; do 举例二:不停地从终端读入一个整数,输入9则退出 NUMBER=0 while [ "$NUMBER" != "9" ]; do read -p 'Enter a integer, 9 to exit' NUMBER echo You typed is $NUMBER done

Bash中的循环控制(while循环) while read LINE do 举例三:逐行读取文件的内容,进行部分内容替换 while read LINE do echo $LINE | sed -e "s/node/blade/" done </etc/hosts

Bash中的循环控制(while循环) target_pid=10254 while true do sleep 10 举例四:无限循环及跳出 target_pid=10254 while true do sleep 10 if ! ps $target_pid &>/dev/null then break fi done break语句用于跳出循环 break <n>,可以跳出多重循环

Bash中的循环控制(until循环) until condition_judgement do ... done 与while循环语法一致,但意思“相反”,没有while循环常用 until循环是先执行循环,直到满足判断条件后跳出

Bash中的函数 function_name() { ... } function_name 在Shell 中,函数就是一组实现一定功能的命令集合; 函数由两部分组成: 函数名(在一个脚本中必须唯一); 函数体(命令集合); function_name() { ... } #先定义,后使用 function_name

Bash中的函数(函数参数) swap_filename() { file1=$1 file2=$2 cp $file1 file1.bak 举例:交换两个文件的文件名 swap_filename() { file1=$1 file2=$2 cp $file1 file1.bak mv $file2 $file1 mv $file1.bak $file2 }

Bash中的函数(函数的退出状态) check_file_lines() { file=$1 lines=`wc -l $file` 函数结尾可以掉用return语句返回执行状态,0表示无错误 举例: check_file_lines() { file=$1 lines=`wc -l $file` if [ $lines -gt 1000 ]; then return 0 else return -1 fi } check_file_lines result.log && echo "file is long enough"

提纲 Shell简介 Bash编程基础 常用字符处理工具介绍

正则表达式regex 正则表达式:进行精确文字匹配的句法规则;比通配符强大无数倍 Regex的基本元字符集: . 匹配任意单个字符 * 一个单字符后紧跟*,表示匹配该字符0次或任意多次 ^ 匹配行首 $ 匹配行尾 [] 匹配序列中的任何一个,比如[abc123]、[a-z0-9] [^...]匹配非序列中的字符 \ 转意特殊字符 pattern{n} 匹配规则重复n次 pattern{n,} 匹配规则重复至少n次 pattern{n,m} 匹配规则重复至少n次,至多m次

正则表达式regex(续1) Regex的扩展元字符集: Regex举例: + 一个单字符后紧跟+,表示匹配该字符1次或任意多次 ? 一个单字符后紧跟?,表示匹配该字符0次或1次 (patterns) 匹配规则组合 Regex举例: ^The 匹配行首的The .* 匹配任意字符或字符串 ^$ 匹配空行 ^.*$ 匹配任意行 A[0-9]\.txt 匹配A0.txt,A1.txt,...,A9.txt [^0-9a-zA-Z] 匹配非数字或字母的字符 \([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\} 匹配IPv4的IP地址

字符查找工具grep grep 是 Linux 下使用最广泛的命令之一,其作用是在一个或多个文件中查找某个字符模式所在的行,并将结果输出到屏幕上 grep 以行为单位进行处理,不会对输入文件本身进行修改 grep 家族由 grep、egrep 和 fgrep 组成: grep: 标准 grep 命令,本文主要讨论此命令。 egrep: 扩展 grep,支持基本及扩展的正则表达式。 fgrep: 固定 grep (fixed grep),按字面解释所有的字符,即正则表达式中的元字符不会被特殊处理。

字符查找工具grep(续1) 可以把匹配模式写入到一个文件中,每行写一个,然后使用 -f 选项,将该匹配模式传递给 grep 命令 grep [选项] pattern file1 file2 ... pattern:可以是正则表达式(用单引号括起来)、 或字符串(加双引号)、或一个单词。 file1 file2 ... :文件名列表,作为 grep 命令的输入;grep 的输入也可以来自标准输入或管道; 可以把匹配模式写入到一个文件中,每行写一个,然后使用 -f 选项,将该匹配模式传递给 grep 命令 grep -f patternfile file1 file2 ...

字符查找工具grep (续2) grep 常用选项 -c 只输出匹配的行的总数 -i 不区分大小写 -h 查询多个文件时,不显示文件名 -l 查询多个文件时,只输出包含匹配模式的文件的文件名 -n 显示匹配的行及行号 -v 反向查找,即只显示不包含匹配模式的行 -s 不显示错误信息 grep -i 'an*' datafile

字符查找工具grep(举例) 查找包含字符串Hello的行 grep 'Hello' datafile 查找以#开头的行 grep '^#' datafile 查找非空行并另存 grep -v '^$' datafile >datefile2 与管道符连用 cat /etc/hosts | grep 'node' | wc -l

字符流编辑工具sed sed 是什么 sed 是一个精简的、非交互式的编辑器 sed 如何工作

字符流编辑工具sed(续1) sed的命令行调用方式 sed [-n][-e] 'sed_cmd' input_file -n:缺省情况下,sed 在将下一行读入缓冲区之前,自动输出行缓冲区中的内容。此选项可以关闭自动输出。 -e:允许调用多条 sed 命令,如: sed -e 'sed_cmd1' -e 'sed_cmd2' input_file sed_cmd:使用格式: [address]sed_edit_cmd (通常用单引号括起来),其中 address 为 sed 的行定位模式,用于指定将要被 sed 编辑的行。如果省略,sed 将编辑所有的行。sed_edit_cmd 为 sed 对被编辑行将要进行的编辑操作。 input_file:sed 编辑的文件列表,若省略,sed 将从标准输入(重定向或管道)中读取输入。

字符流编辑工具sed (续2) 也可以将 sed 命令存在脚本文件,然后调用 sed [选项] -f sed_script_file input_file 例:sed -n -f sedfile1 datafile 将 sed 命令插入脚本文件,生成 sed 可执行脚本文件,在命令行中直接键入脚本文件名来执行。 #!/bin/sed -f sed_cmd1 ... ... 例:./sedfile2.sed -n datafile

字符流编辑工具sed (续3) sed_cmd 中 address 的定位方式 n 表示第 n 行 $ 表示最后一行 m,n /pattern/ 查询包含指定模式的行。如 /disk/、/[a-z]/ /pattern/,n 表示从包含指定模式的行 到 第 n 行 n,/pattern/ 表示从第 n 行 到 包含指定模式的行 /模式1/,/模式2/ 表示从包含模式1 到 包含模式2的行 ! 反向选择, 如 m,n!的结果与 m,n 相反

字符流编辑工具sed (续4) 常用的 sed_edit_cmd p :打印匹配行 sed -n '1,3p' datafile sed -n '/north/p' datafile = :显示匹配行的行号 sed -n '/north/=' datafile d :删除匹配的行 sed -n '/north/d' datafile

字符流编辑工具sed (续5) r :读文件,将另外一个文件中的内容附加到指定行后。 sed -n '$r newdatafile' datafile w :写文件,将指定行写入到另外一个文件中。 sed -n '/west/w newdatafile' datafile n :将指定行的下面一行读入编辑缓冲区。 sed -n '/eastern/{n;s/AM/Archie/p}' datafile 对指定行同时使用多个 sed 编辑命令时,需用大括号 “ {} ” 括起来,命令之间用分号 “ ; ” 格开。注意与 -e 选项的区别

字符流编辑工具sed (续6) q :退出,读取到指定行后退出 sed。 sed '/east/{s/east/west/;q}' datafile 常见的 sed 编辑命令小结 p 打印匹配行 s 替换命令 = 显示匹配行的行号 l 显示指定行中所有字符 d 删除匹配的行 r 读文件 a\ 在指定行后面追加文本 w 写文件 i\ 在指定行前面追加文本 n 读取指定行的下面一行 c\ 用新文本替换指定的行 q 退出 sed

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

谢谢!