分类目录归档:shell

Linux后台运行&符号、nohup命令、输出重定向等使用方法-演道网

列出若干种情形,便于这几个命令及参数的理解:

在命令最后加上&符号,表示让这个进程到后台去执行,这样立刻返回到提示符状态,我们可以接着做下面的事。如:command &

但此时如果这个进程有输出,还是会显示出来,这又会干扰到我们的shell窗口。所以可以考虑把标准输出重定向到某个文件去,如:command >output &

现在清净了。但有时我们会发现后台运行的进程出错了,我们希望把错误信息也保存起来。那就用到了linux中默认定义两个变量:1指标准输出;2指错误输出,所以写成这样:command 1>output 2>error & ,正常的输出在output文件里,错误的输出在error文件里。这里也等同于command >output 2>error &

有时候只想保留一种,另外一个既不输出又不保存,那就用到这个设备/dev/null,所以忽略错误输出:command 1>output 2>/dev/null & ;忽略标准输出:command 1>/dev/null 2>error &;忽略全部输出: command 1>/dev/null 2>/dev/null

1,2两种信息之间还可以进行重定向,所以这种:command 1>output 2>&1 & 表示错误输出也重定向回标准输出,即两种信息都保存到output里。那干嘛不写成command 1>output 2>output & 呢?答案是这样不行,别看都输出到/dev/null可以,但如果写成相同的文件名会导致冲突,所以如果想同时保留只能是上面的写法;同理:忽略全部输出还可以写成: command >/dev/null 2>&1 &

这样的文件输出,每次运行会覆盖现有的文件,如果我们希望追加而不是覆盖,那么就用>>符号,这样命令就是: command 1>>log 2>>error &

基本上参数的各种写法都在这里了,但有个问题。这种“后台”进程在shell一直打开的情况下是没有问题的,如果我们关了shell窗口甚至退出ssh登录或vnc登录,那么进程自动就结束了。所以如果想退出窗口乃至退出登录仍然保持程序运行,再加上nohup,形如:nohup command 1>output 2>&1 &

大概就这些情况了。

转载自演道,想查看更及时的互联网产品技术热点文章请点击http://go2live.cn

Linux教程:uname 使用-演道网

uname

uname用于打印操作系统和硬件架构相关的信息,对于可能在多个系统或架构上运行的Shell脚本程序很有用, 缺省选项相当于 -s--system
$uname [-amnrsvpio]
-a--all 显示全部的信息

$ uname -a
Linux E435 3.19.0-68-generic #76-Ubuntu SMP Fri Aug 12 08:48:09 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

-m--machine显示电脑类型

$ uname -m
x86_64

-n--nodename显示在网络上的主机名称

$ uname -n
E435

-r--kernel-release 显示操作系统的发行编号

$ uname -r
3.19.0-68-generic

-s--system显示操作系统名称

$ uname -s
Linux

-v--kernel-version显示操作系统版本

$ uname -v
#76-Ubuntu SMP Fri Aug 12 08:48:09 UTC 2016

-p--processor显示处理器类型

$ uname -p
x86_64

-i--hardware-platform显示硬件平台

$ uname -i
x86_64

-o--operationg-system显示操作系统

$ uname -o
GNU/Linux

转载自演道,想查看更及时的互联网产品技术热点文章请点击http://go2live.cn

Linux教程:pwd, cd, ls, cat, touch, mkdir, rmdir, rm 使用-演道网

学习Shell命令最好的资料当然的是$man, 绝对是查找命令的第一大杀器,但是我们有时只是想实现某个功能,甚至连这个命令是什么都不知道,又或者不想淹没在man里大段大段的英文里,大家可以在Linux公社搜索有关Linux命令的教程。

pwd

查看当前工作目录,现在常见的发行版都会把当前的完整路径标记在”$”之前,所以也不怎么需要这个命令,但是如果你嫌前面的路径标记太长了,把路径改的很短了(sudo vi ~/.bashrc里改PS1的值),此时就需要这个命令显示当前目录的完整路径

cd

切换工作目录
Linux是多用户操作系统,每个用户(除了root)都有自己的home目录,用表示,root有自己的文件夹/root
Linux中用./表示当前目录,用../表示当前目录的父目录,用于表示相对路径

ls

列出目录里的内容,缺省选项列出非隐藏内容的简要信息,缺省目录就列出当前目录的内容
$ls -F [目录] #列出非隐藏内容的简要信息,并标识文件类型,/表示目录,@表示连接,普通文件无标识
$ls -l [目录] #列出非隐藏内容的详细信息
$ls -a/-f [目录] #列出所有内容的简要信息
$ls -al [目录] #列出所有文件的详细信息

cat

查看一个文件,将其中的内容直接显示在Terminal

touch

创建一个文件,可以接很多parameter,一次性创建很多文件

cp

复制一个文件,缺省选项时复制文件
cp [文件] [新目录] #将文件1复制到新目录
cp -r [目录] [新目录] #-r表示recursion,将目录1连同其子目录一并复制到新目录

mv

移动/重命名一个文件/目录
mv [文件/目录] [新目录] #将文件1移动到新目录
mv [文件1/目录1] [文件2/目录2] #将文件1/目录1移动到文件2/目录2所在目录并重命名为文件2/目录2

mkdir

创建一个目录,缺省选项创建一个目录
$mkdir -r #-r表示递归生成目录,就是指定路径中的所有目录,只要不存在,就会被创建

rmdir

删除一个空目录
$rm -p [目录] #递归删除所有的空目录

rm

删除一个文件/目录
$rm [文件] #删除一个文件
$rm -r [目录] #递归删除一个目录及其里面的内容

转载自演道,想查看更及时的互联网产品技术热点文章请点击http://go2live.cn

Shell 功能、配置和插件-演道网

关于shell,一个广义的解释就是在用户与操作系统之间,提供一个工具或接口给用户来操作计算机系统;用户在shell中通过输入命令行,按下回车键,shell执行命令后就能返回结果,达到操作计算机的效果。
但有很多人会问,为什么要学习shell呢?以下是我对为什么要学习shell的看法:

  • 在通过ssh来远程操纵Linux/Unix服务器时,都是使用shell而不是用户界面
  • 相比于通过点击多个用户界面来执行操作,输入命令行更加直接和快捷
  • 利用管道组合各种可用工具,来创建和定制宏工具
  • 使用shell script将重复简单的任务自动化

而shell有很多种:Bourne Shell, C Shell,Korn Shell,Bourne-again Shell,TENEX C Shell等,通过命令cat /etc/shells可以查看系统支持哪些shell:

System Support Shell.png

Linux/Unix默认都是使用Bash(Bourne-again Shell),但我更倾向于使用zsh,但由于配置过于复杂,前期很少人使用,但后来有外国程序员弄出一个Oh My ZSH来管理zsh的配置和支持更多插件,使得zsh变得更容易使用和更加强大。

zsh shell.png

Shell有哪些功能

  • 命令历史记录

    一旦你在shell敲入正确命令并能执行后,shell就会存储你所敲入命令的历史记录(存放在~/.bash_history文件),方便你再次运行之前的命令。
    你可以按方向键来查看之前执行过的命令

Shell Command History.gif

可以用!!来执行上一条命令,但最常用还是使用ctrl-r来搜索命令历史记录

Shell Search Command History.gif
  • 命令和文件补全(按tab键)

    当你输入命令或文件名时,你可以通过按tab键来补全命令或文件名,这样可以让你更快敲入命令和敲入正确的命令。
    有时你忘记具体某个命令,但你记住命令开头的几个字母是gi,可以敲入字母gi,按tab键来显示与前几个字母有关的所有命令:

    Shell Command Complete.gif

    当用cd命令前往某个目录时,你不必敲入整个路径的所有目录名,你只需敲入目录前几个字母,然后按tab键逐个补全目录名即可。

    Shell Auto Complete Dir.gif
  • 命令别名

    命令别名是一个比较有用的东西,特别适应用于简化命令输入。比如,你要更新cocoapods时,在shell输入以下命令行

    pod update --verbose --no-repo-update

    但每次都输入这么长的命令行,多么麻烦啊。所以,这时使用命令别名来简化命令行的输入:

    alias pod_update='pod update --verbose --no-repo-update'

    下次你只需要输入pod_update就可以更新cocoapod
    你可以使用alias命令来显示所有命令别名

    list all alias .png
  • 任务控制(job control)

    使用shell登陆系统后,想要一边复制文件、一边查找文件、一边进行编译代码、一边下载软件,当然可以通过开启多个shell来完成,但如果想只在一个shell来完成以上多个任务时,此时可以使用shell的一个特性任务控制

    在学会如何使用命令来控制任务之前,先了解两个概念:前台(foreground)后台(background)前台就是出现提示符让用户操作的环境,而后台就是不能与用户交互的环境,你无法使用 ctrl-c 终止它,可使用 bg/fg 呼叫该任务。

    下面介绍一些命令如何控制任务:

    1. 将任务放在后台运行:命令行 + &

    job control 1.png

    注意一下上面打印信息,[1]表示job number(任务编号),7089表示PID(进程号)。在后台执行的命令,如果有stdout和stderr,数据依旧输出到屏幕上,可以通过数据重定向传输到文件中,就不会影响前台的工作。

    job control 2.png
    2. 将任务丢到后台暂停:ctrl-z

    在shell中执行find / -print命令,然后按下ctrl-z将任务丢到后台暂停:

    job control 3.png

    由上面打印可知,任务find / -print暂停执行,并将任务放在后台,返回一个job number[2]

    3. 查看后台所有任务状态:jobs -l

    输入jobs -l 查看后台所有的任务状态:

    job control 4.png

    仔细查看打印信息,有没有留意到在PID 74177431之前有-+两个符号,-表示最近第二个被放到后台的任务号码,+表示最近被放到后台的任务号码。

    4. 将后台的任务拿到前台处理:fg %jobnumber

    输入fg会默认取出+的任务,然后迅速按下ctrl-z

    job control 5.png

    看上面打印的PID7431,确实如此。再次输入jobs -l来查看后台所有任务的信息

    job control 6.png

    这次输入fg %1来讲后台的任务拿到前台处理。

    5. 将后台的任务变成运行中:bg %jobnumber

    输入jobs -l查看任务状态:

    job control 7.png

    然后输入bg %2; jobs -l将后台任务变成运行,并查看任务状态,然后不断地输入打印信息,这时需要关闭终端才能kill这个shell进程的子进程。

    6. 管理后台当中的任务:kill -signal %jobnumber

    有时,任务在后台运行或暂停,这时我想结束这个任务,怎样办呢?你可以使用kill命令将任务结束。
    输入find / -print命令,并按下ctrl-z暂停任务:

    job control 8.png

    输入kill -9 %1;jobs -l结束任务并显示任务状态:

    job control 9.png
  • shell script

    shell script是利用shell的功能所编写的一个程序,这个程序使用纯文本文件来保存一些shell的命令,并遵循shell的语法规则,搭配数据重定向、管道、和正则表达式等功能来组合各种工具,实现简单重复任务的自动化。

  • 通配符

    除了完整的字符串之外,shell还支持许多的通配符来帮助用户查询和命令执行。我简答地列出常用的几个通配符:

符号 含义
* 表示0到无穷多个任意字符
? 表示有一个任意字符
[] 表示有一个在中括号内的字符。例如[abc]表示有个字符,可能是abc其中一个
[-] 表示在编码顺序内的所有字符。例如[1-7]表示有个字符,范围1到7其中一个
[^] 表示反向选择。例如表示有一个字符,只要不是a,b,c的其他字符都可以

iTerm 2(for mac) && Oh My Zsh

如果你是mac的用户,推荐一个终端应用iTerm 2, iTerm 2 相比mac自带的 Terminal 应用,有太多优点了。例如,支持画面分割,可以设置主题,各种使用的快捷键,以及快速唤出。配合 Oh My Zsh 使用,简直优雅到爆!

Oh My Zsh安装

  • curl方式
    curl -L https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh | sh
  • wget方式
    wget https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O - | sh

    安装完之后,关闭当前终端,并重新打开一个,oh my zsh的默认主题是robbyrussell,效果如下:

robbyrussell theme.jpg

配置

如果你想定制和扩展zsh,oh my zsh提供配置文件~/.zshrc来配置,可以设置环境变量和别名;

# Support autojump
[[ -s ~/.autojump/etc/profile.d/autojump.sh ]] && . ~/.autojump/etc/profile.d/autojump.sh

# setup moco alias name
alias moco_service="moco start -p 12306 -g settings.json"

#setup macvim alias name
alias vim="/Applications/MacVim.app/Contents/MacOS/Vim"

#setup pod update alias name
alias pod_update='pod update --verbose --no-repo-update'

Themes列出所有可用主题,每个主题都有截屏效果并教你如何设置,选择你喜欢的主题,在配置文件~/.zshrc查找字符串ZSH_THEME="robbyrussell",通过改变ZSH_THEME环境变量来改变主题。例如,

ZSH_THEME="agnoster"

oh my zsh提供数十种主题,相关文件在~/.oh-my-zsh/themes 目录,可以编辑主题来满足自身需求,我是使用默认的robbyrussell,不过做了一点小小改动:

PROMPT='%{$fg_bold[red]%}➜ %{$fg_bold[green]%}%p%{$fg[cyan]%}%d %{$fg_bold[blue]%}$(git_prompt_info)%{$fg_bold[blue]%}% %{$reset_color%}> '
#PROMPT='${ret_status}%{$fg_bold[green]%}%p %{$fg[cyan]%}%c %{$fg_bold[blue]%}$(git_prompt_info)%{$fg_bold[blue]%} % %{$reset_color%}> '

与原来不同的是,将c(表示当前目录)改为d(表示绝对路径),另外在尾部添加一个>作为隔离符号,效果如下:

modified robbyrussell.png

插件

oh my zsh提供丰富的插件,存放在~/.oh-my-zsh/plugins目录下:

oh my zsh plugins.png

想了解每个插件的功能以及如何使用,只要打开相关插件的目录下zsh文件即可,以git插件为例:

git plugin.png

打开git.plugin.zsh文件,里面有很多命名别来来简化命令的输入。你可以根据自己的需要来启用哪些插件,只需在~/.zshrc配置文件追加内容即可:

plugins=(git autojump osx)

我来介绍一下一些常用插件的使用吧:

git

当你处在一个git受控的目录下时,Shell明确显示gitbranch信息,另外简化git很多命令,具体使用请参考:Plugin:git

autojump

autojump插件使你能够快速切换路径,再也不需要逐个敲入目录,只需敲入目标目录,就可以迅速切换目录。

  • 安装
    如果你是mac用户,可以使用brew安装:
    brew install autojump

    如果是linux用户,首先下载autojump最近版本,比如:

    git clone git://github.com/joelthelion/autojump.git

    然后进入目录,执行

    ./install.py

    最近将以下代码加入~/.zshrc配置文件:

    [[ -s ~/.autojump/etc/profile.d/autojump.sh ]] && . ~/.autojump/etc/profile.d/autojump.sh
  • 使用
    如果你之前打开过~/.oh-my-zsh/themes目录,现在只需敲入j themes就可以快速切换到~/.oh-my-zsh/themes目录。

    autojump.png
osx
  • tab – 在一个新标签打开当前目录
  • cdf – cd到当前Finder目录
  • quick-look – 快速浏览特殊的文件
  • man-preview – 在Preview应用打开特定的man page
  • trash – 将特定的文件移到垃圾桶

使用

  1. 因为zsh兼容bash,所以之前使用bash的人切换到zsh毫无压力
  2. 智能拼写纠正,比如你输入cls,会提示

    auto correct.png
  3. 各种补全:除了支持命令补全和文件补全之外,还支持命令参数补全,插件内容补全,只需要按tab
  4. 使用autojump智能跳转
  5. 目录浏览和跳转:输入d,就显示在会话里访问的目录列表,输入列表前的序号,即可以跳转

    list dir and jump.png
  6. 输入..可以返回到上级目录

    parent dir.png

    YouTube有个演示视频 zsh shell详细介绍如果使用Oh My Zsh

总结

作为的一个程序员,我觉得shell是一个必不可少的工具,使用它能够毫不费劲地操作计算机。在shell提示下,通过调用各种各样的工具,并结合管道,将这些工具根据自己需要组合起来,创建和制定宏工具,甚至编写shell script来将简单而重复的工作自动化,做到Don’t repeat your self

转载自演道,想查看更及时的互联网产品技术热点文章请点击http://go2live.cn

Shell变量、数据重定向和管道-演道网

在上一篇博客Shell功能、配置和插件中,介绍了为什么要使用shell,shell有哪些功能,如何使用oh my zsh来提高效率等,本篇重点介绍,shell中的变量的如何设置和读取数据,读取之后如何使用变量?每个程序一般都有输入和输出,让我们看看数据重定向如何处理输入和输出的?还有,Unix/Linux系统提供丰富的工具,我们如何将这些工具通过管道来组合成更加强大的宏工具呢?下面,由我来逐一详细介绍变量、数据重定向和管道。

Variable & Redirection & Pipe.png

Variable & Redirection & Pipe.png

变量

变量的作用

变量与其他程序设计语言一样,都是存储数据,然后被程序引用。相比于不使用变量,而是直接使用数据,存在两个问题:

  1. 当数据改变时,直接使用数据的时候却不能灵活地根据数据改变而随着改变,而使用变量却不同,它能够做到这点。
  2. 当数据发生变化时,如果想保证数据一致性,必须查找所有引用该数据的所有地方,然后将它修改,当下一次再需要修改时,也是像这种情况一样,是多么繁琐的事,而变量却不用,只需要修改变量值即可。

因此,变量具有可变性易于修改的两个特点。

变量的分类

在shell中,大概分为两种变量:环境变量局部变量,主要区别在于它们的使用范围不同,环境变量可以在父进程与子进程之间共享,而自定义变量只在本进程使用。举一个简单的例子来说明:

no share variable.png

no share variable.png

我首先设置一个shell变量devname=sam,然后输入bash打开一个新的shell,而这个shell是子进程,然后echo $devname输出变量值,变量值为空,最后exit退出子进程。

share variable.png

share variable.png

但使用export devname设置环境变量后,再次进入输入bash进入子进程之后,echo $devname输出变量值,这次变量值是sam

查看环境变量envset

如果想查看系统中以及自定义有哪些环境变量,可以使用env命令:

env command.png

env command.png

set命令不仅能查看环境变量,还可以查看与shell接口有关的变量,下面只截取一部分变量:

set command.png

set command.png

变量有哪些操作

显示echo $variable

如果你想显示某个变量的值,例如PATH,你只需要输入:

echo $PATH
echo command.png

echo command.png

注意上面一条命令,需要在变量名前加上一个符号$,这样才能访问变量

设置variable=value和取消unset

如果你想设置某个变量的值,只需在变量名和变量值之间用符号=连接就行了,例如:

set variable.png

set variable.png

由上面的输入命令echo $devname,显示结果为。由此可知,一开始如果没有设置某个变量时,它的是为。另外,设置变量的规则还需要几点注意:

  1. 在命名变量名时,变量名称只能是英文字母和数字,而且首字母不能是数字。下面演示一个错误的例子:

    wrong variable name.png

    wrong variable name.png
  2. 等号=两边不能有空格

    blank can't exist.png

    blank can’t exist.png
  3. 如果变量值有空格,可用双引号" "或单引号' '来包围变量值,但两者是有区别:
    双引号" "内的一些特殊字符,可以保持原有的特性,例如:

    double quotation marks.png

    double quotation marks.png

    而单引号' '内的一些特殊字符,仅为一般字符,即纯文本,例如:

    single quotation marks.png

    single quotation marks.png
  4. 如果想显示一些特殊字符($、空格、!等),在字符前面加上用转义字符
  5. 有些时候,变量的值可能来源于一些命令,这时你可以使用反单引号`命令`$(命令),例如:
    使用反单引号`命令`的方式

    get information from comand 1.png

    get information from comand 1.png

    使用$(命令)的方式

    get information from comand 2.png

    get information from comand 2.png
  6. 如果变量想增加变量的值,可以使用$variable累加

    append variable value.png

    append variable value.png
  7. 如果变量需要在其他子进程使用,用export关键字来设置变量为环境变量

    export VARIABLE
  8. 系统环境变量一般都是字母全部大写,例如:PATHHOMESHELL
  9. 如果想取消设置变量的值,使用unset variable命令。注意,变量之前是没有符号$

    unset variable.png

    unset variable.png

环境配置文件

之前那些设置的环境变量,一旦退出系统后,就不能再次使用,如果想再次使用,必须重新再设置才行。如果想就算退出系统,也能重新使用自定义的环境变量,那怎么办呢?

不用怕,系统提供一些环境配置文件:/etc/profile~/.bash_profile/etc/profile是系统整体的设置,每个用户共享,最好不要修改;而~/.bash_profile属于单个用户的设置,每个用户设置后,互不影响和共享。但因为我使用oh my zsh,之前~/.bash_profile设置一些配置都不生效了,但它提供一个环境配置文件.zshrc,所以如果想设置环境变量TEST,只需将export TEST=test添加.zshrc即可。

export variable in zshrc file.png

export variable in zshrc file.png

但在.zshrc文件设置好环境变量TEST后,echo $TEST为空,原因是还没使用source命令来读取环境配置文件。使用source .zshrc命令之后,设置环境变量TEST生效了

source command.png

source command.png

数据重定向

含义

当输入命令行时,一般都有输入参数(standard input),而命令行处理完之后,一般都有输出结果,结果有可能成功(standard output),也有可能失败(standard error),而这些结果一般都会输出到屏幕上,如果你想控制结果输出到文件或以文件作为输入的话,你需要了解数据重定向的分类和符号操作。

Redirection.png

Redirection.png

分类

数据重定向主要分为三类:

  • stdin,表示标准输入,代码为0,使用<<<操作符
    符号<表示以文件内容作为输入
    符号<<表示输入时的结束符号
  • stdout,表示标准输出,代码为1,使用>>>操作符
    符号>表示以覆盖的方式将正确的数据输出到指定文件中
    符号>>表示以追加的方式将正确的数据输出到指定文件中
  • stderr,表示标准错误输出,代码为2,使用2>2>>操作符
    符号2>表示以覆盖的方式将错误的数据输出到指定文件中
    符号2>>表示以追加的方式将错误的数据输出到指定文件中

使用

stdout

当你输入ls命令,屏幕会显示当前目录有哪些文件和目录;而当你使用符号>时,输出结果将重定向到dir.txt文件,而不显示在屏幕上

stdin demo.png

stdin demo.png

而符号>与符号>>有什么区别呢?>表示当文件存在时,将文件内容清空,然后stdout结果存放到文件中。而>>表示当文件存在时,文件内容并没有清空,而是将stdout结果追加到文件尾部。

当你再次输入命令ls > dir.txt时,文件内容并没有改变,因为之前文件内容被清空,然后stdout结果存放在dir.txt文件

stdin demo 1.png

stdin demo 1.png

而你这次使用符号ls >> dir.txt的话,文件内容被追加到dir.txt文件

stdin demo 2.png

stdin demo 2.png
stderr

这次我输入命令ls test显示一个不存在的文件,会显示错误信息。然后将错误信息输出到文件error.txt

stderr demo 1.png

stderr demo 1.png

如果你想追加错误信息,可以使用2>>符号

stderr demo 2.png

stderr demo 2.png
stdout & stderr
  • 将stdout和stderr分离:>2>符号
    输入ls README.md test,在屏幕显示既有正确信息,也有错误信息,如果想将正确信息和错误信息分离到不同文件,你可以同时使用>2>符号

    seperate stdout & stderr.png

    seperate stdout & stderr.png
  • 将stdout和stderr合并:&>符号
    如果你想将正确信息和错误信息合并,且输出到同一个文件,可以使用&>符号

    combine stdout & stderr.png

    combine stdout & stderr.png
stdin

一般输入一些简单的数据的方式都是通过键盘,但是如果要输入大量的数据,最好还是通过文件的方式。举一个简单例子:
首先输入cat > test命令之后,你就可以输入内容,那些内容最终会存放在test文件

stdin demo 1.png

stdin demo 1.png

但如果有大量数据从一个文件导入到test文件时,此时需要用到<符号

stdin demo 2.png

stdin demo 2.png

还一个符号<<需要解释,符号<<表示输入时的结束符号。输入cat > test << "eof"命令之后,你就可以输入内容,那些内容最终会存放在test文件,输入完内容后可以输入eof来结束输入

stdin demo 3.png

stdin demo 3.png

管道

在Unix设计哲学中,有一个重要设计原则--KISS(Keep it Simple, Stupid),大概意思就是只关注如何做好一件事,并把它做到极致。每个程序都有各自的功能,那么有没有一样东西将不同功能的程序互相连通,自由组合成更为强大的宏工具呢?此时,管道出现了,它能够让程序实现了高内聚,低耦合

How Pipe works.png

How Pipe works.png

如果我想查看文件是否存在某个关键字,此时我可以使用管道

Pipe Demo.png

Pipe Demo.png

命令cat README.md | grep 'pod'的处理过程分为两步:

  1. cat README.md查看文件内容
  2. 然后将cat README.md输出的内容作为grep 'pod'命令的输入,再进行处理。

上面一个很关键的符号|,就是管道,它能够将前一个命令处理完的stdout作为下一条命令stdin

转载自演道,想查看更及时的互联网产品技术热点文章请点击http://go2live.cn

awk使用shell中变量

转载 自http://www.builder.com.cn/2007/0915/507454.shtml

一:”‘$var'”

这种写法大家无需改变用’括起awk程序的习惯,是老外常用的写法.如:

var=”test”

awk ‘BEGIN{print “‘$var'”}’

这种写法其实际是双括号变为单括号的常量,传递给了awk.

如果var中含空格,为了shell不把空格作为分格符,便应该如下使用:

var=”this is a test”

awk ‘BEGIN{print “‘”$var”‘”}’

二:'”$var”‘

这种写法与上一种类似.如果变量含空格,则变为'””$var””‘较为可靠.

三.把括起awk程序的”变为””,使用”$var”

如:

$var=”this is a test”

awk ‘BEGIN{print “$var”}”

这是因为在””里$是特殊字符,而在”里$是普通字符.

四:export 变量,使用ENVIRON[“var”]形式,

如:

$var=”this is a test”;export $var

awk ‘BEGIN{print ENVIRON[“var”]}’

五:当然也可以使用-v选项

如:

$var=”this is a test”

awk -vnvar=”$var” ‘{print nvar}’

这样便把系统变量定义成了awk变量.

查看本文来源