<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Command_line on 菠萝油与天光墟</title>
    <link>https://ramsayleung.github.io/zh/tags/command_line/</link>
    <description>Recent content in Command_line on 菠萝油与天光墟</description>
    <image>
      <title>菠萝油与天光墟</title>
      <url>https://ramsayleung.github.io/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</url>
      <link>https://ramsayleung.github.io/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</link>
    </image>
    <generator>Hugo -- 0.146.7</generator>
    <language>zh</language>
    <copyright>See this site&amp;rsquo;s source code here, licensed under GPLv3 ·</copyright>
    <lastBuildDate>Thu, 09 Jan 2025 20:51:33 -0800</lastBuildDate>
    <atom:link href="https://ramsayleung.github.io/zh/tags/command_line/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>脚本分享</title>
      <link>https://ramsayleung.github.io/zh/post/2017/share_shell_script/</link>
      <pubDate>Sat, 22 Apr 2017 00:00:00 -0700</pubDate>
      <guid>https://ramsayleung.github.io/zh/post/2017/share_shell_script/</guid>
      <description>share of my shell script snippet</description>
      <content:encoded><![CDATA[<p>分享一下平时工作生活中编写的一些脚本片段(一直更新). 适用于 OS X 和 Linux</p>
<h2 id="准备工作"><span class="section-num">1</span> 准备工作</h2>
<p>因为我比较多的脚本都是基于 <code>percol</code> 这个神器，所以需要先安装 <code>percol</code>, 如果 不了解 <code>percol</code> 的话，可以翻看一下我之前的文章 <a href="https://ramsayleung.github.io/post/2017/percol/">Linux/Unix Shell 二三事之神器percol</a> .</p>
<p>我一般将写好的函数 source 命令添加到 Shell. 例如脚本函数都在一个叫 <code>tool_function.sh</code> 的文件里面，而我使用 Zsh, 则只需要在 <code>.zshrc</code> 添加一句语句：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">source</span> /path/to/tool_function.sh
</span></span></code></pre></td></tr></table>
</div>
</div><p>如果使用 Bash, 添加到 <code>.bashrc</code> 即可。</p>
<h2 id="有趣的脚本"><span class="section-num">2</span> 有趣的脚本</h2>
<h3 id="ssh-免密码登录"><span class="section-num">2.1</span> SSH 免密码登录</h3>
<p>SSH 基本就是登录远程服务器的标配了，只是每次登录服务器都要输入密码，未免太麻烦了(好吧，我拥有懒惰这个美德)，所以我决定配置 SSH 的免密码登录。代码如下：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="k">function</span> config_ssh_login_key<span class="o">(){</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="o">[</span> <span class="nv">$#</span> -lt <span class="m">3</span> <span class="o">]</span><span class="p">;</span><span class="k">then</span>
</span></span><span class="line"><span class="cl">       <span class="nb">echo</span> <span class="s2">&#34;Usage: </span><span class="k">$(</span>basename <span class="nv">$0</span><span class="k">)</span><span class="s2"> -u user -h hostname -p port&#34;</span>
</span></span><span class="line"><span class="cl">       <span class="nb">kill</span> -INT <span class="nv">$$</span>
</span></span><span class="line"><span class="cl">    <span class="k">fi</span>
</span></span><span class="line"><span class="cl">       <span class="c1">#if public/private key doesn&#39;t exist ,generate public/private key</span>
</span></span><span class="line"><span class="cl">       <span class="k">if</span> <span class="o">[</span> -f ~/.ssh/id_rsa <span class="o">]</span><span class="p">;</span><span class="k">then</span>
</span></span><span class="line"><span class="cl">          <span class="nb">echo</span> <span class="s2">&#34;public/private key exists&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="k">else</span>
</span></span><span class="line"><span class="cl">              ssh-keygen -t rsa
</span></span><span class="line"><span class="cl">       <span class="k">fi</span>
</span></span><span class="line"><span class="cl">          <span class="k">while</span> <span class="nb">getopts</span> :u:h:p: option
</span></span><span class="line"><span class="cl">          <span class="k">do</span>
</span></span><span class="line"><span class="cl">              <span class="k">case</span> <span class="s2">&#34;</span><span class="nv">$option</span><span class="s2">&#34;</span> in
</span></span><span class="line"><span class="cl">                  u<span class="o">)</span> <span class="nv">user</span><span class="o">=</span><span class="nv">$OPTARG</span><span class="p">;;</span>
</span></span><span class="line"><span class="cl">                  h<span class="o">)</span> <span class="nv">hostname</span><span class="o">=</span><span class="nv">$OPTARG</span><span class="p">;;</span>
</span></span><span class="line"><span class="cl">                  p<span class="o">)</span> <span class="nv">port</span><span class="o">=</span><span class="nv">$OPTARG</span><span class="p">;;</span>
</span></span><span class="line"><span class="cl">                  *<span class="o">)</span> <span class="nb">echo</span> <span class="s2">&#34;Unknown option:</span><span class="nv">$option</span><span class="s2">&#34;</span><span class="p">;;</span>
</span></span><span class="line"><span class="cl">              <span class="k">esac</span>
</span></span><span class="line"><span class="cl">          <span class="k">done</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">          <span class="k">if</span> <span class="o">[</span> -z <span class="s2">&#34;</span><span class="nv">$port</span><span class="s2">&#34;</span> <span class="o">]</span><span class="p">;</span><span class="k">then</span>
</span></span><span class="line"><span class="cl">             <span class="nv">port</span><span class="o">=</span><span class="m">22</span>
</span></span><span class="line"><span class="cl">          <span class="k">fi</span>
</span></span><span class="line"><span class="cl">             <span class="c1">#check whether it is the first time to run this script and whether authorized_keys exists</span>
</span></span><span class="line"><span class="cl">             <span class="c1"># ssh_host_and_user=&#34;$1@$2&#34;</span>
</span></span><span class="line"><span class="cl">             <span class="nv">authorized_keys</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$HOME</span><span class="s2">/.ssh/authorized_keys&#34;</span>
</span></span><span class="line"><span class="cl">             <span class="nb">read</span> -r -s -p <span class="s2">&#34;</span><span class="nv">$user</span><span class="s2">@</span><span class="nv">$hostname</span><span class="s2">&#39;s password:&#34;</span> password
</span></span><span class="line"><span class="cl">             <span class="k">if</span> sshpass -pv <span class="nv">$password</span> ssh -p <span class="s2">&#34;</span><span class="nv">$port</span><span class="s2">&#34;</span> <span class="s2">&#34;</span><span class="nv">$user</span><span class="s2">@</span><span class="nv">$hostname</span><span class="s2">&#34;</span> <span class="nb">test</span> -e <span class="s2">&#34;</span><span class="nv">$authorized_keys</span><span class="s2">&#34;</span><span class="p">;</span><span class="k">then</span>
</span></span><span class="line"><span class="cl">                <span class="nb">echo</span> <span class="s2">&#34;authorized key exists&#34;</span>
</span></span><span class="line"><span class="cl">                <span class="nb">kill</span> -INT <span class="nv">$$</span>
</span></span><span class="line"><span class="cl">                <span class="k">else</span>
</span></span><span class="line"><span class="cl">                    sshpass -p <span class="nv">$password</span> ssh  <span class="nv">$user</span>@<span class="nv">$hostname</span> -p <span class="nv">$port</span> <span class="s2">&#34;mkdir -p ~/.ssh;chmod 0700 .ssh&#34;</span>
</span></span><span class="line"><span class="cl">                    sshpass -p <span class="nv">$password</span> scp -P <span class="nv">$port</span>  ~/.ssh/id_rsa.pub <span class="nv">$user</span>@<span class="nv">$hostname</span>:~/.ssh/authorized_keys
</span></span><span class="line"><span class="cl">                    <span class="c1"># ssh-copy-id &#34;$user@$hostname -p $port&#34;</span>
</span></span><span class="line"><span class="cl">             <span class="k">fi</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>基本做法就是生成一对公私密钥，然后把公钥发送到服务器。而脚本其他的部分就是判断密钥是否存在，修改密钥权限等工作。用法也很简单，假如你把以上脚本保存到了一个叫 <code>config_ssh_login_key.sh</code> 的文件：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">bash config_ssh_login_key.sh -h your-server-ip -u user -p <span class="m">2222</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>当然，如果你按照我的前面提到的做法，用 source 命令引入脚本，你可以直接在命令行输入：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">config_ssh_login_key -u root -h your-server-ip
</span></span></code></pre></td></tr></table>
</div>
</div><p>如果端口未指定，默认端口为 22</p>
<h3 id="生成若干位密钥"><span class="section-num">2.2</span> 生成若干位密钥</h3>
<p>生成若干位的密钥是常见的需求，得益于 Linux/Unix 命令行强大的过滤器，所以只需把命令整理成脚本即可：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># generate key</span>
</span></span><span class="line"><span class="cl"><span class="k">function</span> gkey<span class="o">(){</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="o">[</span> -n <span class="s2">&#34;</span><span class="nv">$1</span><span class="s2">&#34;</span> <span class="o">]</span><span class="p">;</span><span class="k">then</span>
</span></span><span class="line"><span class="cl">       <span class="nb">local</span> <span class="nv">length</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$1</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">       <span class="k">else</span>
</span></span><span class="line"><span class="cl">           <span class="nb">local</span> <span class="nv">length</span><span class="o">=</span><span class="m">32</span>
</span></span><span class="line"><span class="cl">    <span class="k">fi</span>
</span></span><span class="line"><span class="cl">       <span class="nv">OS_NAME</span><span class="o">=</span><span class="k">$(</span>uname<span class="k">)</span>
</span></span><span class="line"><span class="cl">       <span class="k">if</span> <span class="o">[</span> <span class="nv">$OS_NAME</span> <span class="o">=</span> <span class="s2">&#34;Darwin&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">           <span class="nv">LC_CTYPE</span><span class="o">=</span>C cat /dev/urandom <span class="p">|</span>tr -cd <span class="s2">&#34;[:alnum:]&#34;</span><span class="p">|</span>head -c <span class="s2">&#34;</span><span class="nv">$length</span><span class="s2">&#34;</span><span class="p">;</span><span class="nb">echo</span>
</span></span><span class="line"><span class="cl">       <span class="k">else</span>
</span></span><span class="line"><span class="cl">           cat /dev/urandom <span class="p">|</span>tr -cd <span class="s2">&#34;[:alnum:]&#34;</span><span class="p">|</span>head -c <span class="s2">&#34;</span><span class="nv">$length</span><span class="s2">&#34;</span><span class="p">;</span><span class="nb">echo</span>
</span></span><span class="line"><span class="cl">       <span class="k">fi</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>用法：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">gkey <span class="m">45</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>即生成一个45位字符的随机密钥，如果没有指定长度的话，默认是 32 位。因为 OS X和 Linux 的 <code>tr</code> 使用有差异，所以要处理一下</p>
<h3 id="复制命令行输出"><span class="section-num">2.3</span> 复制命令行输出</h3>
<p>有时可能需要复制某个命令的输出，一般的做法都是运行某个命令，用鼠标选中，然后复制。例如在生成密钥之后，需要复制到项目的配置文件。但是每次都要用鼠标，效率实在不高。这个功能其实可以脚本实现：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nv">OS_NAME</span><span class="o">=</span><span class="k">$(</span>uname<span class="k">)</span>
</span></span><span class="line"><span class="cl"><span class="k">function</span> pclip<span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="o">[</span> <span class="nv">$OS_NAME</span> <span class="o">=</span> <span class="s2">&#34;CYGWIN&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">        putclip <span class="s2">&#34;</span><span class="nv">$@</span><span class="s2">&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">elif</span> <span class="o">[</span> <span class="nv">$OS_NAME</span> <span class="o">=</span> <span class="s2">&#34;Darwin&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">        pbcopy <span class="s2">&#34;</span><span class="nv">$@</span><span class="s2">&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="o">[</span> -x /usr/bin/xsel <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">            xsel -ib <span class="s2">&#34;</span><span class="nv">$@</span><span class="s2">&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="k">else</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="o">[</span> -x /usr/bin/xclip <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">                xclip -selection c <span class="s2">&#34;</span><span class="nv">$@</span><span class="s2">&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="k">else</span>
</span></span><span class="line"><span class="cl">                <span class="nb">echo</span> <span class="s2">&#34;Neither xsel or xclip is installed!&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="k">fi</span>
</span></span><span class="line"><span class="cl">        <span class="k">fi</span>
</span></span><span class="line"><span class="cl">    <span class="k">fi</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>备注：这个脚本不是我原创，取自 <a href="http://blog.binchen.org/archive.html">陈斌</a> 博客。</p>
<p>在 Linux 运行这脚本需要先安装 xsel 或者是 xclip 命令。结合生成密钥的命令使用：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">gkey -28<span class="p">|</span>pclip
</span></span></code></pre></td></tr></table>
</div>
</div><p>这样，生成的密钥就被复制到系统上了。</p>
<h3 id="复制当前目录"><span class="section-num">2.4</span> 复制当前目录</h3>
<p>有时候，我需要复制当前目录下某个文件的路径，但是无论是文件管理器，还是在Shell 中都要用鼠标选中然后复制指定文件的路径，效率不高且很不方便。所以我通过结合 percol 和上面提高的 pclip 函数改进了做法：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="k">function</span> pwdf<span class="o">()</span>
</span></span><span class="line"><span class="cl"><span class="o">{</span>
</span></span><span class="line"><span class="cl">    <span class="nb">local</span> <span class="nv">current_dir</span><span class="o">=</span><span class="sb">`</span><span class="nb">pwd</span><span class="sb">`</span>
</span></span><span class="line"><span class="cl">    <span class="nb">local</span> <span class="nv">copied_file</span><span class="o">=</span><span class="sb">`</span>find <span class="nv">$current_dir</span> -type f -print <span class="p">|</span>percol<span class="sb">`</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> -n <span class="nv">$copied_file</span> <span class="p">|</span>pclip<span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>只需在 Shell 中输入 <code>pwdf</code>, 然后选择需要复制的路径即可。
运行截图：</p>

<figure>
    
    
    <input type="checkbox" id="zoomCheck-069ae" hidden>
    <label for="zoomCheck-069ae">
    
    
    <img class="zoomCheck" loading="lazy" src="https://i.imgur.com/Ppkm2xV.gif"/> 
    
    
    </label>
</figure>

<hr>
<p><span class="timestamp-wrapper"><span class="timestamp">&lt;2017-05-22 Mon&gt; </span></span> Update</p>
<h3 id="判断-unix-系统的版本"><span class="section-num">2.5</span> 判断 Unix 系统的版本</h3>
<p>因为我经常需要在不同的 Unix 机器之间切换，例如工作用的 Mac OS X, 另外一台笔记本上的 Fedora, 还有一台工作站上的 Arch Linux, 以及各种发行版本的 VPS 等，在不同的发行版本或者系统之间切换，我希望我常用的工具也可以很轻易地移植到不同的发行版本上。</p>
<p>但是不同的发行版本使用不同的包安装管理器，例如 OS X 上的 <code>brew</code>, Fedora 的 <code>dnf</code>, Centos 的 <code>yum</code>, Ubuntu 上的 <code>apt-get</code> 等等。如果可以通过使用脚本来实现根据不同的发行版本使用不同的包安装管理器安装软件，这样就省心很多。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># GetOSVersion</span>
</span></span><span class="line"><span class="cl"><span class="k">function</span> GetOSVersion <span class="o">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># Figure out which vendor we are</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="o">[[</span> -x <span class="s2">&#34;`which sw_vers 2&gt;/dev/null`&#34;</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># OS/X</span>
</span></span><span class="line"><span class="cl">        <span class="nv">os_VENDOR</span><span class="o">=</span><span class="sb">`</span>sw_vers -productName<span class="sb">`</span>
</span></span><span class="line"><span class="cl">    <span class="k">elif</span> <span class="o">[[</span> -x <span class="k">$(</span>which lsb_release 2&gt;/dev/null<span class="k">)</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">        <span class="nv">os_VENDOR</span><span class="o">=</span><span class="k">$(</span>lsb_release -i -s<span class="k">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="o">[[</span> <span class="s2">&#34;Debian,Ubuntu,LinuxMint&#34;</span> <span class="o">=</span>~ <span class="nv">$os_VENDOR</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">            <span class="nv">os_PACKAGE</span><span class="o">=</span><span class="s2">&#34;deb&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="k">elif</span> <span class="o">[[</span> <span class="s2">&#34;SUSE LINUX&#34;</span> <span class="o">=</span>~ <span class="nv">$os_VENDOR</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">            lsb_release -d -s <span class="p">|</span> grep -q openSUSE
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="o">[[</span> <span class="nv">$?</span> -eq <span class="m">0</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">                <span class="nv">os_VENDOR</span><span class="o">=</span><span class="s2">&#34;openSUSE&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="k">fi</span>
</span></span><span class="line"><span class="cl">        <span class="k">elif</span> <span class="o">[[</span> <span class="nv">$os_VENDOR</span> <span class="o">==</span> <span class="s2">&#34;openSUSE project&#34;</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">            <span class="nv">os_VENDOR</span><span class="o">=</span><span class="s2">&#34;openSUSE&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="k">elif</span> <span class="o">[[</span> <span class="nv">$os_VENDOR</span> <span class="o">=</span>~ Red.*Hat <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">            <span class="nv">os_VENDOR</span><span class="o">=</span><span class="s2">&#34;Red Hat&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="k">fi</span>
</span></span><span class="line"><span class="cl">        <span class="nv">os_CODENAME</span><span class="o">=</span><span class="k">$(</span>lsb_release -c -s<span class="k">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">elif</span> <span class="o">[[</span> -r /etc/redhat-release <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># Red Hat Enterprise Linux Server release 5.5 (Tikanga)</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># Red Hat Enterprise Linux Server release 7.0 Beta (Maipo)</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># CentOS release 5.5 (Final)</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># CentOS Linux release 6.0 (Final)</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># Fedora release 16 (Verne)</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># XenServer release 6.2.0-70446c (xenenterprise)</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># Oracle Linux release 7</span>
</span></span><span class="line"><span class="cl">        <span class="nv">os_CODENAME</span><span class="o">=</span><span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> r in <span class="s2">&#34;Red Hat&#34;</span> CentOS Fedora XenServer<span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">            <span class="nv">os_VENDOR</span><span class="o">=</span><span class="nv">$r</span>
</span></span><span class="line"><span class="cl">        <span class="k">done</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="o">[</span> <span class="s2">&#34;</span><span class="nv">$os_VENDOR</span><span class="s2">&#34;</span> <span class="o">=</span> <span class="s2">&#34;Red Hat&#34;</span> <span class="o">]</span> <span class="o">&amp;&amp;</span> <span class="o">[[</span> -r /etc/oracle-release <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">            <span class="nv">os_VENDOR</span><span class="o">=</span>OracleLinux
</span></span><span class="line"><span class="cl">        <span class="k">fi</span>
</span></span><span class="line"><span class="cl">    <span class="k">elif</span> <span class="o">[[</span> -r /etc/SuSE-release <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> r in openSUSE <span class="s2">&#34;SUSE Linux&#34;</span><span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="o">[[</span> <span class="s2">&#34;</span><span class="nv">$r</span><span class="s2">&#34;</span> <span class="o">=</span> <span class="s2">&#34;SUSE Linux&#34;</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">                <span class="nv">os_VENDOR</span><span class="o">=</span><span class="s2">&#34;SUSE LINUX&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="k">else</span>
</span></span><span class="line"><span class="cl">                <span class="nv">os_VENDOR</span><span class="o">=</span><span class="nv">$r</span>
</span></span><span class="line"><span class="cl">            <span class="k">fi</span>
</span></span><span class="line"><span class="cl">            <span class="nv">os_VENDOR</span><span class="o">=</span><span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="k">done</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># If lsb_release is not installed, we should be able to detect Debian OS</span>
</span></span><span class="line"><span class="cl">    <span class="k">elif</span> <span class="o">[[</span> -f /etc/debian_version <span class="o">]]</span> <span class="o">&amp;&amp;</span> <span class="o">[[</span> <span class="k">$(</span>cat /proc/version<span class="k">)</span> <span class="o">=</span>~ <span class="s2">&#34;Debian&#34;</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">        <span class="nv">os_VENDOR</span><span class="o">=</span><span class="s2">&#34;Debian&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">fi</span>
</span></span><span class="line"><span class="cl">    <span class="nb">export</span> os_VENDOR
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="根据不同的发行版本安装软件"><span class="section-num">2.6</span> 根据不同的发行版本安装软件</h3>
<p>刚刚上面的脚本是为了准确判断出所有的 *nix 系统的，但是方便起见，也可以直接使用=uname= 命令</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">  1
</span><span class="lnt">  2
</span><span class="lnt">  3
</span><span class="lnt">  4
</span><span class="lnt">  5
</span><span class="lnt">  6
</span><span class="lnt">  7
</span><span class="lnt">  8
</span><span class="lnt">  9
</span><span class="lnt"> 10
</span><span class="lnt"> 11
</span><span class="lnt"> 12
</span><span class="lnt"> 13
</span><span class="lnt"> 14
</span><span class="lnt"> 15
</span><span class="lnt"> 16
</span><span class="lnt"> 17
</span><span class="lnt"> 18
</span><span class="lnt"> 19
</span><span class="lnt"> 20
</span><span class="lnt"> 21
</span><span class="lnt"> 22
</span><span class="lnt"> 23
</span><span class="lnt"> 24
</span><span class="lnt"> 25
</span><span class="lnt"> 26
</span><span class="lnt"> 27
</span><span class="lnt"> 28
</span><span class="lnt"> 29
</span><span class="lnt"> 30
</span><span class="lnt"> 31
</span><span class="lnt"> 32
</span><span class="lnt"> 33
</span><span class="lnt"> 34
</span><span class="lnt"> 35
</span><span class="lnt"> 36
</span><span class="lnt"> 37
</span><span class="lnt"> 38
</span><span class="lnt"> 39
</span><span class="lnt"> 40
</span><span class="lnt"> 41
</span><span class="lnt"> 42
</span><span class="lnt"> 43
</span><span class="lnt"> 44
</span><span class="lnt"> 45
</span><span class="lnt"> 46
</span><span class="lnt"> 47
</span><span class="lnt"> 48
</span><span class="lnt"> 49
</span><span class="lnt"> 50
</span><span class="lnt"> 51
</span><span class="lnt"> 52
</span><span class="lnt"> 53
</span><span class="lnt"> 54
</span><span class="lnt"> 55
</span><span class="lnt"> 56
</span><span class="lnt"> 57
</span><span class="lnt"> 58
</span><span class="lnt"> 59
</span><span class="lnt"> 60
</span><span class="lnt"> 61
</span><span class="lnt"> 62
</span><span class="lnt"> 63
</span><span class="lnt"> 64
</span><span class="lnt"> 65
</span><span class="lnt"> 66
</span><span class="lnt"> 67
</span><span class="lnt"> 68
</span><span class="lnt"> 69
</span><span class="lnt"> 70
</span><span class="lnt"> 71
</span><span class="lnt"> 72
</span><span class="lnt"> 73
</span><span class="lnt"> 74
</span><span class="lnt"> 75
</span><span class="lnt"> 76
</span><span class="lnt"> 77
</span><span class="lnt"> 78
</span><span class="lnt"> 79
</span><span class="lnt"> 80
</span><span class="lnt"> 81
</span><span class="lnt"> 82
</span><span class="lnt"> 83
</span><span class="lnt"> 84
</span><span class="lnt"> 85
</span><span class="lnt"> 86
</span><span class="lnt"> 87
</span><span class="lnt"> 88
</span><span class="lnt"> 89
</span><span class="lnt"> 90
</span><span class="lnt"> 91
</span><span class="lnt"> 92
</span><span class="lnt"> 93
</span><span class="lnt"> 94
</span><span class="lnt"> 95
</span><span class="lnt"> 96
</span><span class="lnt"> 97
</span><span class="lnt"> 98
</span><span class="lnt"> 99
</span><span class="lnt">100
</span><span class="lnt">101
</span><span class="lnt">102
</span><span class="lnt">103
</span><span class="lnt">104
</span><span class="lnt">105
</span><span class="lnt">106
</span><span class="lnt">107
</span><span class="lnt">108
</span><span class="lnt">109
</span><span class="lnt">110
</span><span class="lnt">111
</span><span class="lnt">112
</span><span class="lnt">113
</span><span class="lnt">114
</span><span class="lnt">115
</span><span class="lnt">116
</span><span class="lnt">117
</span><span class="lnt">118
</span><span class="lnt">119
</span><span class="lnt">120
</span><span class="lnt">121
</span><span class="lnt">122
</span><span class="lnt">123
</span><span class="lnt">124
</span><span class="lnt">125
</span><span class="lnt">126
</span><span class="lnt">127
</span><span class="lnt">128
</span><span class="lnt">129
</span><span class="lnt">130
</span><span class="lnt">131
</span><span class="lnt">132
</span><span class="lnt">133
</span><span class="lnt">134
</span><span class="lnt">135
</span><span class="lnt">136
</span><span class="lnt">137
</span><span class="lnt">138
</span><span class="lnt">139
</span><span class="lnt">140
</span><span class="lnt">141
</span><span class="lnt">142
</span><span class="lnt">143
</span><span class="lnt">144
</span><span class="lnt">145
</span><span class="lnt">146
</span><span class="lnt">147
</span><span class="lnt">148
</span><span class="lnt">149
</span><span class="lnt">150
</span><span class="lnt">151
</span><span class="lnt">152
</span><span class="lnt">153
</span><span class="lnt">154
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[</span> <span class="s2">&#34;</span><span class="k">$(</span>uname<span class="k">)</span><span class="s2">&#34;</span> <span class="o">==</span> <span class="s2">&#34;Darwin&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># Do something under Mac OS X platform</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;This is mac os&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># check if brew exists</span>
</span></span><span class="line"><span class="cl">    <span class="nb">type</span> brew&gt;/dev/null 2&gt;<span class="p">&amp;</span><span class="m">1</span> <span class="o">||</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">        <span class="nb">echo</span> &gt;<span class="p">&amp;</span><span class="m">2</span> <span class="s2">&#34; require brew but it&#39;s not installed.  Aborting.&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="nb">exit</span> 1<span class="p">;</span> <span class="o">}</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;install htop&#34;</span>
</span></span><span class="line"><span class="cl">    brew install htop
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;install ag&#34;</span>
</span></span><span class="line"><span class="cl">    brew install ag
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;install httpie&#34;</span>
</span></span><span class="line"><span class="cl">    brew install httpie
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;install fasd&#34;</span>
</span></span><span class="line"><span class="cl">    brew install fasd
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;install tree&#34;</span>
</span></span><span class="line"><span class="cl">    brew install tree
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;install shellcheck&#34;</span>
</span></span><span class="line"><span class="cl">    brew install shellcheck
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;install guile&#34;</span>
</span></span><span class="line"><span class="cl">    brew install guile
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;install proxychains-ng&#34;</span>
</span></span><span class="line"><span class="cl">    brew install proxychains-ng
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;install pandoc&#34;</span>
</span></span><span class="line"><span class="cl">    brew install pandoc
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;install markdown&#34;</span>
</span></span><span class="line"><span class="cl">    brew install markdown
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;install cloc&#34;</span>
</span></span><span class="line"><span class="cl">    brew install cloc
</span></span><span class="line"><span class="cl"><span class="k">elif</span> <span class="o">[</span> <span class="s2">&#34;</span><span class="k">$(</span>expr substr <span class="k">$(</span>uname -s<span class="k">)</span> <span class="m">1</span> 5<span class="k">)</span><span class="s2">&#34;</span> <span class="o">==</span> <span class="s2">&#34;Linux&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># Do something under GNU/Linux platform</span>
</span></span><span class="line"><span class="cl">    GetOSVersion
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="o">[</span> <span class="s2">&#34;</span><span class="nv">$os_VENDOR</span><span class="s2">&#34;</span> <span class="o">==</span> <span class="s2">&#34;Ubuntu&#34;</span> <span class="o">]</span> <span class="o">||</span> <span class="o">[[</span> <span class="s2">&#34;</span><span class="nv">$os_VENDOR</span><span class="s2">&#34;</span> <span class="o">==</span> <span class="s2">&#34;Debian&#34;</span> <span class="o">]]</span> <span class="o">||</span> <span class="o">[[</span> <span class="s2">&#34;</span><span class="nv">$os_VENDOR</span><span class="s2">&#34;</span> <span class="o">==</span> <span class="s2">&#34;LinuxMint&#34;</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># install htop</span>
</span></span><span class="line"><span class="cl">        sudo apt-get install htop -y
</span></span><span class="line"><span class="cl">        <span class="c1"># install httpie</span>
</span></span><span class="line"><span class="cl">        sudo apt-get install httpie -y
</span></span><span class="line"><span class="cl">        <span class="c1"># install ag</span>
</span></span><span class="line"><span class="cl">        sudo apt-get install  silversearcher-ag -y
</span></span><span class="line"><span class="cl">        <span class="c1"># install zeal</span>
</span></span><span class="line"><span class="cl">        sudo apt-get install zeal -y
</span></span><span class="line"><span class="cl">        <span class="c1"># install ncdu</span>
</span></span><span class="line"><span class="cl">        sudo apt-get install ncdu -y
</span></span><span class="line"><span class="cl">        <span class="c1"># install i3</span>
</span></span><span class="line"><span class="cl">        sudo apt-get install i3 -y
</span></span><span class="line"><span class="cl">        <span class="c1"># install emacs (i could die without it)</span>
</span></span><span class="line"><span class="cl">        sudo apt-get install emacs -y
</span></span><span class="line"><span class="cl">        <span class="c1"># install vim</span>
</span></span><span class="line"><span class="cl">        sudo apt-get install vim -y
</span></span><span class="line"><span class="cl">        <span class="c1"># install tree</span>
</span></span><span class="line"><span class="cl">        sudo apt-get install tree -y
</span></span><span class="line"><span class="cl">        <span class="c1"># install shellcheck</span>
</span></span><span class="line"><span class="cl">        sudo apt-get install shellcheck -y
</span></span><span class="line"><span class="cl">        <span class="c1"># install guile (scheme compiler)</span>
</span></span><span class="line"><span class="cl">        sudo apt-get install guile -y
</span></span><span class="line"><span class="cl">        <span class="c1"># install source code pro font</span>
</span></span><span class="line"><span class="cl">        <span class="o">[</span> -d /usr/share/fonts/opentype <span class="o">]</span> <span class="o">||</span> sudo mkdir /usr/share/fonts/opentype
</span></span><span class="line"><span class="cl">        sudo git clone https://github.com/adobe-fonts/source-code-pro.git /usr/share/fonts/opentype/scp
</span></span><span class="line"><span class="cl">        sudo fc-cache -f -v
</span></span><span class="line"><span class="cl">        <span class="c1"># install proxychains-ng</span>
</span></span><span class="line"><span class="cl">        sudo apt-get install proxychains-ng -y
</span></span><span class="line"><span class="cl">        <span class="c1"># install pandoc</span>
</span></span><span class="line"><span class="cl">        sudo apt-get install pandoc -y
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        sudo apt-get install markdown -y
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        sudo apt-get install cloc -y
</span></span><span class="line"><span class="cl">    <span class="k">elif</span> <span class="o">[</span>  <span class="s2">&#34;</span><span class="nv">$os_VENDOR</span><span class="s2">&#34;</span> <span class="o">==</span> <span class="s2">&#34;Fedora&#34;</span> <span class="o">]</span> <span class="o">||</span> <span class="o">[[</span> <span class="s2">&#34;</span><span class="nv">$os_VENDOR</span><span class="s2">&#34;</span> <span class="o">==</span> <span class="s2">&#34;CentOS&#34;</span> <span class="o">]]</span> <span class="o">||</span> <span class="o">[[</span> <span class="s2">&#34;</span><span class="nv">$os_VENDOR</span><span class="s2">&#34;</span> <span class="o">==</span> <span class="s2">&#34;Korora&#34;</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># install ag</span>
</span></span><span class="line"><span class="cl">        sudo yum install -y the_silver_searcher
</span></span><span class="line"><span class="cl">        <span class="c1"># install zeal</span>
</span></span><span class="line"><span class="cl">        sudo yum install -y zeal
</span></span><span class="line"><span class="cl">        <span class="c1"># install httpie</span>
</span></span><span class="line"><span class="cl">        sudo yum install -y httpie
</span></span><span class="line"><span class="cl">        <span class="c1"># install htop</span>
</span></span><span class="line"><span class="cl">        sudo yum install -y htop
</span></span><span class="line"><span class="cl">        <span class="c1"># install ncdu</span>
</span></span><span class="line"><span class="cl">        sudo yum install -y ncdu
</span></span><span class="line"><span class="cl">        <span class="c1"># install vim</span>
</span></span><span class="line"><span class="cl">        sudo yum install -y vim
</span></span><span class="line"><span class="cl">        <span class="c1"># install emacs</span>
</span></span><span class="line"><span class="cl">        sudo yum install -y emacs
</span></span><span class="line"><span class="cl">        <span class="c1"># install i3</span>
</span></span><span class="line"><span class="cl">        sudo yum install -y i3
</span></span><span class="line"><span class="cl">        <span class="c1"># install tree</span>
</span></span><span class="line"><span class="cl">        sudo yum install -y tree
</span></span><span class="line"><span class="cl">        <span class="c1"># install shellcheck</span>
</span></span><span class="line"><span class="cl">        sudo yum install ShellCheck -y
</span></span><span class="line"><span class="cl">        <span class="c1"># install guile</span>
</span></span><span class="line"><span class="cl">        sudo yum install guile -y
</span></span><span class="line"><span class="cl">        <span class="c1"># install source  code pro font</span>
</span></span><span class="line"><span class="cl">        sudo yum install adobe-source-code-pro-fonts -y
</span></span><span class="line"><span class="cl">        <span class="c1"># install proxychains-ng</span>
</span></span><span class="line"><span class="cl">        sudo yum install proxychains-ng -y
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        sudo yum install pandoc -y
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        sudo yum install markdown -y
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1"># count line and space in code</span>
</span></span><span class="line"><span class="cl">        sudo yum install cloc  -y
</span></span><span class="line"><span class="cl">    <span class="k">elif</span> <span class="o">[</span>  <span class="s2">&#34;</span><span class="nv">$os_VENDOR</span><span class="s2">&#34;</span> <span class="o">==</span> <span class="s2">&#34;Arch&#34;</span> <span class="o">]</span> <span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># install ag</span>
</span></span><span class="line"><span class="cl">        sudo pacman -S -y the_silver_searcher
</span></span><span class="line"><span class="cl">        <span class="c1"># install zeal</span>
</span></span><span class="line"><span class="cl">        sudo pacman -S -y zeal
</span></span><span class="line"><span class="cl">        <span class="c1"># install httpie</span>
</span></span><span class="line"><span class="cl">        sudo pacman -S -y httpie
</span></span><span class="line"><span class="cl">        <span class="c1"># install htop</span>
</span></span><span class="line"><span class="cl">        sudo pacman -S -y htop
</span></span><span class="line"><span class="cl">        <span class="c1"># install ncdu</span>
</span></span><span class="line"><span class="cl">        sudo pacman -S -y ncdu
</span></span><span class="line"><span class="cl">        <span class="c1"># install vim</span>
</span></span><span class="line"><span class="cl">        sudo pacman -S -y vim
</span></span><span class="line"><span class="cl">        <span class="c1"># install emacs</span>
</span></span><span class="line"><span class="cl">        sudo pacman -S -y emacs
</span></span><span class="line"><span class="cl">        <span class="c1"># install i3</span>
</span></span><span class="line"><span class="cl">        sudo pacman -S -y i3
</span></span><span class="line"><span class="cl">        <span class="c1"># install tree</span>
</span></span><span class="line"><span class="cl">        sudo pacman -S -y tree
</span></span><span class="line"><span class="cl">        <span class="c1"># install shellcheck</span>
</span></span><span class="line"><span class="cl">        sudo pacman -S ShellCheck -y
</span></span><span class="line"><span class="cl">        <span class="c1"># install guile</span>
</span></span><span class="line"><span class="cl">        sudo pacman -S guile -y
</span></span><span class="line"><span class="cl">        <span class="c1"># install source-code-pro font</span>
</span></span><span class="line"><span class="cl">        sudo pacman -S adobe-source-code-pro-fonts -y
</span></span><span class="line"><span class="cl">        <span class="c1"># install proxychains-ng</span>
</span></span><span class="line"><span class="cl">        sudo pacman -S proxychains-ng -y
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        sudo pacman -S pandoc -y
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        sudo pacman -S markdown -y
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        sudo pacman -S ripgrep -y
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        sudo pacman -S cloc  -y
</span></span><span class="line"><span class="cl">    <span class="k">fi</span>
</span></span><span class="line"><span class="cl"><span class="k">elif</span> <span class="o">[</span> <span class="s2">&#34;</span><span class="k">$(</span>expr substr <span class="k">$(</span>uname -s<span class="k">)</span> <span class="m">1</span> 10<span class="k">)</span><span class="s2">&#34;</span> <span class="o">==</span> <span class="s2">&#34;MINGW32_NT&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># Do something under 32 bits Windows NT platform</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;This is 32-bit windows&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">elif</span> <span class="o">[</span> <span class="s2">&#34;</span><span class="k">$(</span>expr substr <span class="k">$(</span>uname -s<span class="k">)</span> <span class="m">1</span> 10<span class="k">)</span><span class="s2">&#34;</span> <span class="o">==</span> <span class="s2">&#34;MINGW64_NT&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># Do something under 64 bits Windows NT platform</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;this is 64-bit windows&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="加密目录"><span class="section-num">2.7</span> 加密目录</h3>
<p>每个人都会有需要只属于自己的东西，保护这些东西最好的办法就是对其进行加密：</p>
<h4 id="加密"><span class="section-num">2.7.1</span> 加密</h4>
<p>使用 <code>tar</code> 和 <code>openssl</code> 对目录进行加密，先使用 <code>tar</code> 归档当前文件，然后使用
<code>aes256</code> 算法进行加密：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">tar -czf - * <span class="p">|</span> openssl enc -e -aes256 -out encrypted.tar.gz
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="解密"><span class="section-num">2.7.2</span> 解密</h4>
<p>把加密后的归档文件解密到当前命令：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">openssl enc -d -aes256 -in encrypted.tar.gz<span class="p">|</span> tar xz -C <span class="k">$(</span><span class="nb">pwd</span><span class="k">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><div center class="qr-container">
<img src="/ox-hugo/qrcode_gh_e06d750e626f_1.jpg" alt="qrcode_gh_e06d750e626f_1.jpg" width="160px" height="160px" center="t" class="qr-container" />
公号同步更新，欢迎关注👻
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Linux/Unix Shell 二三事之过滤器grep</title>
      <link>https://ramsayleung.github.io/zh/post/2017/grep/</link>
      <pubDate>Mon, 13 Mar 2017 00:00:00 -0700</pubDate>
      <guid>https://ramsayleung.github.io/zh/post/2017/grep/</guid>
      <description>an introduction about grep</description>
      <content:encoded><![CDATA[<p>文本三剑客之 Grep</p>
<blockquote>
<p>grep - print  lines matching a pattern</p></blockquote>
<p>今天我想聊聊 <strong>grep</strong> 这个命令；据说，有Unix/Linux 的地方就会有 <strong>grep</strong>, 这个可能是安装得最广泛的命令之一；那么 <strong>grep</strong> 是用来干什么的呢？</p>
<p>grep 其实是用来在文件中搜索特定内容或者模式的工具(配合正则表达式“食用”，味道更佳 :))现在就来一起看看*grep* 的用法</p>
<h2 id="基本用法"><span class="section-num">1</span> 基本用法</h2>
<h3 id="基础用法"><span class="section-num">1.1</span> 基础用法</h3>
<p>现在假设有一个简单的文本文件(双城记开头)tinytale.txt,内容如下</p>
<blockquote>
<p>it was the best of times it was the worst of times
it was the age of wisdom it was age of foolishness
it was the epoch of belief it was the epoch of incredulity
it was the season of light it was the season of darkness
IT WAS THE SPRING OF HOPE IT WAS THE WINTER OF DESPAIRE</p></blockquote>
<p>现在开始介绍 <strong>grep</strong> 的基本用法： <strong>grep</strong> 的基本用法很简单的，假设我想要搜索单词 <strong>darkness</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">grep darkness /tmp/tinytale.txt
</span></span></code></pre></td></tr></table>
</div>
</div><p>输出如下：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">it was the season of light it was the season of darkness
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="结合正则表达式"><span class="section-num">1.2</span> 结合正则表达式</h3>
<p>默认情况下， <strong>grep</strong> 是开启正则表达式的模式的，所以你可以直接在文件搜索中使用
正则表达式。现在在文件中搜索以字母 <strong>e</strong> 开头后接三个字符，然后以 <strong>h</strong> 结尾的单词：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">grep <span class="s2">&#34;e...h&#34;</span> /tmp/tinytale.txt
</span></span></code></pre></td></tr></table>
</div>
</div><p>输出如下：</p>
<blockquote>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">it was the epoch of belief it was the epoch of incredulity
</span></span></code></pre></td></tr></table>
</div>
</div></blockquote>
<p>可以看到，正则表达式匹配了 <strong>epoch</strong> 这个单词。正则表达式的威力无与伦比的，把 <strong>grep*和正则表达式结合起来可以更好地发挥 *grep</strong> 这个工具的潜力；而本文主要是介绍 <strong>grep</strong>, 更多有关正则表达式的用法不细讲了</p>
<h3 id="统计出现的次数"><span class="section-num">1.3</span> 统计出现的次数</h3>
<p>有时，如果你需要统计某种模式或者某个单词出现的个数，你会发现 <strong>grep</strong> 非常有用；</p>
<p>要实现该功能，只需给 <strong>grep</strong> 添加 <strong>-c</strong> 参数；例如统计单词 <strong>the</strong> 出现的个数：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">grep -c the /tmp/tinytale.txt
</span></span></code></pre></td></tr></table>
</div>
</div><p>结果输出如下：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">4
</span></span></code></pre></td></tr></table>
</div>
</div><p>文本中包含4个 <strong>the</strong></p>
<h3 id="忽略大小写"><span class="section-num">1.4</span> 忽略大小写</h3>
<p>前面提到， <strong>grep</strong> 默认是使用正则表达式来搜索文件的，所以 <strong>grep</strong> 是区分大小写的；</p>
<p>如果你想修改 <strong>grep</strong> 的默认行为来忽略大小写，你可以添加 <strong>-i</strong> 参数</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">grep -i the /tmp/tinytale.txt
</span></span></code></pre></td></tr></table>
</div>
</div><p>输出结果如下：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">it was the best of times it was the worst of times
</span></span><span class="line"><span class="cl">it was the age of wisdom it was age of foolishness
</span></span><span class="line"><span class="cl">it was the epoch of belief it was the epoch of incredulity
</span></span><span class="line"><span class="cl">it was the season of light it was the season of darkness
</span></span><span class="line"><span class="cl">IT WAS THE SPRING OF HOPE IT WAS THE WINTER OF DESPAIRE
</span></span></code></pre></td></tr></table>
</div>
</div><p>可以发现 <strong>THE</strong> 也是可以被 grep 搜索到的；但是如果没有添加 <strong>-i</strong> ,你只会看到4行输出。</p>
<p>当然你可以在正则表达式里面添加忽略大小写的模式，只是直接添加 <strong>-i</strong> 会简单很多。</p>
<h2 id="搜索多个文件"><span class="section-num">2</span> 搜索多个文件</h2>
<p>上面搜索的都只是单个文件，而 grep 可以让你同时搜索多个文件；现在就来看看怎么搜索多个文件吧。</p>
<p>下面两种写法结果都是一样的，但是我个人推崇第一种，因为可以输入更少一些内容 :)</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">grep belief /tmp/<span class="o">{</span>tinytale.txt,tale.txt<span class="o">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">grep belief /tmp/tinytale.txt /tmp/tale.txt
</span></span></code></pre></td></tr></table>
</div>
</div><p>输出结果如下：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">tinytale.txt:it was the epoch of belief it was the epoch of incredulity
</span></span><span class="line"><span class="cl">tale.txt:it was the epoch of belief it was the epoch of incredulity
</span></span><span class="line"><span class="cl">tale.txt:pains of by rearing her in the belief that her father was dead
</span></span><span class="line"><span class="cl">tale.txt:this was no passive belief but an active weapon which they flashed
</span></span><span class="line"><span class="cl">tale.txt:belief in solomon deducting a mere trifle for this slight mistake
</span></span><span class="line"><span class="cl">tale.txt:you will bear testimony to what i have said and to your belief in it
</span></span><span class="line"><span class="cl">tale.txt:herself into the show of a belief that they would soon be reunited
</span></span></code></pre></td></tr></table>
</div>
</div><p>可以看到， <strong>grep</strong> 把匹配到单词的那一行内容和对应的文件都显示出来了，你就可以很方便地看到搜索结果，并知道匹配单词的来源。</p>
<p>如果你也像我这样，不想输入那么多的内容，你可以使用正则表达式匹配所有的文本文件，如下：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">grep belief /tmp/*.txt
</span></span></code></pre></td></tr></table>
</div>
</div><p>输出结果也会跟上面一致 (假设你 <strong><em>tmp</em></strong> 目录下只有两个文本文件); 我告诉*grep* 搜索*/tmp* 下所有的 <strong>.txt</strong> 文件。</p>
<h3 id="递归搜索"><span class="section-num">2.1</span> 递归搜索</h3>
<p>你也可以使用 <strong>grep</strong> 递归搜索目录；你只需在指定目录后，添加 <strong>-R</strong> , <strong>grep</strong> 就会
递归搜索指定目录的所有子目录。我已经把当前目录切换到 <strong>/tmp</strong>:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">grep -R <span class="s2">&#34;belief&#34;</span> .
</span></span></code></pre></td></tr></table>
</div>
</div><p>输出结果如下：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">./tale.txt:it was the epoch of belief it was the epoch of incredulity
</span></span><span class="line"><span class="cl">./tale.txt:pains of by rearing her in the belief that her father was dead
</span></span><span class="line"><span class="cl">./tale.txt:this was no passive belief but an active weapon which they flashed
</span></span><span class="line"><span class="cl">./tale.txt:belief in solomon deducting a mere trifle for this slight mistake
</span></span><span class="line"><span class="cl">./tale.txt:you will bear testimony to what i have said and to your belief in it
</span></span><span class="line"><span class="cl">./tale.txt:herself into the show of a belief that they would soon be reunited
</span></span><span class="line"><span class="cl">./tinytale.txt:it was the epoch of belief it was the epoch of incredulity
</span></span></code></pre></td></tr></table>
</div>
</div><p>结果展示了一系列在当前目录和子目录匹配 <strong>belief</strong> 的文件。此外你也可以排除掉某些你
不需要搜索的文件，例如有一个 <strong>foo.xml</strong> 的文件，里面也可能会有 <strong>belief</strong> 这个单词，
但是你就是不想搜索这个文件，或者全部的 <strong>.xml</strong> 文件，你可以这么玩：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">grep -R --exclude<span class="o">=</span><span class="s2">&#34;*.xml&#34;</span> <span class="s2">&#34;belief&#34;</span> .
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="在标准输入搜索"><span class="section-num">3</span> 在标准输入搜索</h2>
<p><strong>grep</strong> 也是过滤器，所以 <strong>grep</strong> 自然而然具有处理标准输入输出的能力了；处理其他命令的输出结果也是 <strong>grep</strong> 非常常用的场景之一。假设你现在的 <strong>vim</strong> 突然卡顿，挂了:),你想要 <strong>kill</strong> 掉 <strong>vim</strong> 的进程，你可以：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">ps -e<span class="p">|</span>grep vim
</span></span></code></pre></td></tr></table>
</div>
</div><p>结果输出如下：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">samray   21939     1  0 19:42 ?        00:00:00 gvim
</span></span></code></pre></td></tr></table>
</div>
</div><p>其中第一条记录就是你想要搜索的进程了，你运行 <strong>kill 21939</strong> 就可以杀掉 vim 的进程了；因为我系统的是图型化界面的 vim, 所以是 gvim.</p>
<hr>
<p>正如我之前的文章提到的那样，单纯的过滤器的用处似乎不大，但是如果结合起来就会威力无穷至于，如何结合，就需要慢慢探索了。</p>
<h2 id="反向搜索"><span class="section-num">4</span> 反向搜索</h2>
<p>现在执行的搜索都是匹配搜索，即将匹配的内容显示出来，而 <strong>grep</strong> 还有反向搜索的功能 (invert Searches)就是将不包含有指定模式的内容显示出来。</p>
<p>该功能在用来修改有很多注释的配置文件时特别有用；例如常用的服务器软件 <strong>nginx</strong>  的配置文件是默认是含有很多注释的，如下</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">  1
</span><span class="lnt">  2
</span><span class="lnt">  3
</span><span class="lnt">  4
</span><span class="lnt">  5
</span><span class="lnt">  6
</span><span class="lnt">  7
</span><span class="lnt">  8
</span><span class="lnt">  9
</span><span class="lnt"> 10
</span><span class="lnt"> 11
</span><span class="lnt"> 12
</span><span class="lnt"> 13
</span><span class="lnt"> 14
</span><span class="lnt"> 15
</span><span class="lnt"> 16
</span><span class="lnt"> 17
</span><span class="lnt"> 18
</span><span class="lnt"> 19
</span><span class="lnt"> 20
</span><span class="lnt"> 21
</span><span class="lnt"> 22
</span><span class="lnt"> 23
</span><span class="lnt"> 24
</span><span class="lnt"> 25
</span><span class="lnt"> 26
</span><span class="lnt"> 27
</span><span class="lnt"> 28
</span><span class="lnt"> 29
</span><span class="lnt"> 30
</span><span class="lnt"> 31
</span><span class="lnt"> 32
</span><span class="lnt"> 33
</span><span class="lnt"> 34
</span><span class="lnt"> 35
</span><span class="lnt"> 36
</span><span class="lnt"> 37
</span><span class="lnt"> 38
</span><span class="lnt"> 39
</span><span class="lnt"> 40
</span><span class="lnt"> 41
</span><span class="lnt"> 42
</span><span class="lnt"> 43
</span><span class="lnt"> 44
</span><span class="lnt"> 45
</span><span class="lnt"> 46
</span><span class="lnt"> 47
</span><span class="lnt"> 48
</span><span class="lnt"> 49
</span><span class="lnt"> 50
</span><span class="lnt"> 51
</span><span class="lnt"> 52
</span><span class="lnt"> 53
</span><span class="lnt"> 54
</span><span class="lnt"> 55
</span><span class="lnt"> 56
</span><span class="lnt"> 57
</span><span class="lnt"> 58
</span><span class="lnt"> 59
</span><span class="lnt"> 60
</span><span class="lnt"> 61
</span><span class="lnt"> 62
</span><span class="lnt"> 63
</span><span class="lnt"> 64
</span><span class="lnt"> 65
</span><span class="lnt"> 66
</span><span class="lnt"> 67
</span><span class="lnt"> 68
</span><span class="lnt"> 69
</span><span class="lnt"> 70
</span><span class="lnt"> 71
</span><span class="lnt"> 72
</span><span class="lnt"> 73
</span><span class="lnt"> 74
</span><span class="lnt"> 75
</span><span class="lnt"> 76
</span><span class="lnt"> 77
</span><span class="lnt"> 78
</span><span class="lnt"> 79
</span><span class="lnt"> 80
</span><span class="lnt"> 81
</span><span class="lnt"> 82
</span><span class="lnt"> 83
</span><span class="lnt"> 84
</span><span class="lnt"> 85
</span><span class="lnt"> 86
</span><span class="lnt"> 87
</span><span class="lnt"> 88
</span><span class="lnt"> 89
</span><span class="lnt"> 90
</span><span class="lnt"> 91
</span><span class="lnt"> 92
</span><span class="lnt"> 93
</span><span class="lnt"> 94
</span><span class="lnt"> 95
</span><span class="lnt"> 96
</span><span class="lnt"> 97
</span><span class="lnt"> 98
</span><span class="lnt"> 99
</span><span class="lnt">100
</span><span class="lnt">101
</span><span class="lnt">102
</span><span class="lnt">103
</span><span class="lnt">104
</span><span class="lnt">105
</span><span class="lnt">106
</span><span class="lnt">107
</span><span class="lnt">108
</span><span class="lnt">109
</span><span class="lnt">110
</span><span class="lnt">111
</span><span class="lnt">112
</span><span class="lnt">113
</span><span class="lnt">114
</span><span class="lnt">115
</span><span class="lnt">116
</span><span class="lnt">117
</span><span class="lnt">118
</span><span class="lnt">119
</span><span class="lnt">120
</span><span class="lnt">121
</span><span class="lnt">122
</span><span class="lnt">123
</span><span class="lnt">124
</span><span class="lnt">125
</span><span class="lnt">126
</span><span class="lnt">127
</span><span class="lnt">128
</span><span class="lnt">129
</span><span class="lnt">130
</span><span class="lnt">131
</span><span class="lnt">132
</span><span class="lnt">133
</span><span class="lnt">134
</span><span class="lnt">135
</span><span class="lnt">136
</span><span class="lnt">137
</span><span class="lnt">138
</span><span class="lnt">139
</span><span class="lnt">140
</span><span class="lnt">141
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-cfg" data-lang="cfg"><span class="line"><span class="cl"><span class="c1">#user www-data;</span>
</span></span><span class="line"><span class="cl"><span class="na">worker_processes auto;</span>
</span></span><span class="line"><span class="cl"><span class="na">pid /run/nginx.pid;</span>
</span></span><span class="line"><span class="cl"><span class="na">include /etc/nginx/modules-enabled/*.conf;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">events {</span>
</span></span><span class="line"><span class="cl"><span class="na">worker_connections 1024;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># multi_accept on;</span>
</span></span><span class="line"><span class="cl"><span class="na">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">http {</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">##</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Basic Settings</span>
</span></span><span class="line"><span class="cl"><span class="c1">##</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">sendfile on;</span>
</span></span><span class="line"><span class="cl"><span class="na">tcp_nopush on;</span>
</span></span><span class="line"><span class="cl"><span class="na">tcp_nodelay on;</span>
</span></span><span class="line"><span class="cl"><span class="na">keepalive_timeout 65;</span>
</span></span><span class="line"><span class="cl"><span class="na">types_hash_max_size 2048;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># server_tokens off;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># server_names_hash_bucket_size 64;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># server_name_in_redirect off;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">include /etc/nginx/mime.types;</span>
</span></span><span class="line"><span class="cl"><span class="na">default_type application/octet-stream;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">##</span>
</span></span><span class="line"><span class="cl"><span class="c1"># SSL Settings</span>
</span></span><span class="line"><span class="cl"><span class="c1">##</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE</span>
</span></span><span class="line"><span class="cl"><span class="na">ssl_prefer_server_ciphers on;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">##</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Logging Settings</span>
</span></span><span class="line"><span class="cl"><span class="c1">##</span>
</span></span><span class="line"><span class="cl"><span class="na">log_format main &#39;$remote_addr - $remote_user [$time_local] &#34;$request&#34; $status $bytes_sent &#34;$http_referer&#34; &#34;$http_user_agent&#34; &#34;$gzip_ratio&#34;&#39;;</span>
</span></span><span class="line"><span class="cl"><span class="na">access_log /var/log/nginx/access.log;</span>
</span></span><span class="line"><span class="cl"><span class="na">error_log /var/log/nginx/error.log;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">##</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Gzip Settings</span>
</span></span><span class="line"><span class="cl"><span class="c1">##</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">gzip on;</span>
</span></span><span class="line"><span class="cl"><span class="na">gzip_disable &#34;msie6&#34;;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># gzip_vary on;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># gzip_proxied any;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># gzip_comp_level 6;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># gzip_buffers 16 8k;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># gzip_http_version 1.1;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">##</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Virtual Host Configs</span>
</span></span><span class="line"><span class="cl"><span class="c1">##</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">include /etc/nginx/conf.d/*.conf;</span>
</span></span><span class="line"><span class="cl"><span class="na">include /etc/nginx/sites-enabled/*;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">ignore_invalid_headers on;</span>
</span></span><span class="line"><span class="cl"><span class="na">client_header_timeout 240;</span>
</span></span><span class="line"><span class="cl"><span class="na">client_body_timeout 240;</span>
</span></span><span class="line"><span class="cl"><span class="na">send_timeout 240;</span>
</span></span><span class="line"><span class="cl"><span class="na">client_max_body_size 100m;</span>
</span></span><span class="line"><span class="cl"><span class="na">proxy_buffer_size 128k;</span>
</span></span><span class="line"><span class="cl"><span class="na">proxy_buffers 8 128k;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">upstream tomcat_server{</span>
</span></span><span class="line"><span class="cl"><span class="na">server 127.0.0.1:8080 fail_timeout</span><span class="o">=</span><span class="s">0;</span>
</span></span><span class="line"><span class="cl"><span class="na">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">upstream gunicorn_server{</span>
</span></span><span class="line"><span class="cl"><span class="na">server 127.0.0.1:5000 fail_timeout</span><span class="o">=</span><span class="s">0;</span>
</span></span><span class="line"><span class="cl"><span class="na">}</span>
</span></span><span class="line"><span class="cl"><span class="na">server{</span>
</span></span><span class="line"><span class="cl"><span class="na">server_name 127.0.0.1;</span>
</span></span><span class="line"><span class="cl"><span class="na">listen 443;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ssl on;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ssl_certificate /etc/letsencrypt/live/samray.ren/fullchain.pem;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ssl_certificate_key /etc/letsencrypt/live/samray.ren/privkey.pem;</span>
</span></span><span class="line"><span class="cl"><span class="na">location / {</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Forward SSL so that Tomcat knows what to do</span>
</span></span><span class="line"><span class="cl"><span class="na">proxy_set_header X-Forwarded-Host $host;</span>
</span></span><span class="line"><span class="cl"><span class="na">proxy_set_header X-Forwarded-Server $host;</span>
</span></span><span class="line"><span class="cl"><span class="na">proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</span>
</span></span><span class="line"><span class="cl"><span class="na">proxy_pass http://tomcat_server;</span>
</span></span><span class="line"><span class="cl"><span class="na">proxy_set_header X-Forwarded-Proto https;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">proxy_redirect off;</span>
</span></span><span class="line"><span class="cl"><span class="na">proxy_connect_timeout      240;</span>
</span></span><span class="line"><span class="cl"><span class="na">proxy_send_timeout         240;</span>
</span></span><span class="line"><span class="cl"><span class="na">proxy_read_timeout         240;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">location /test{</span>
</span></span><span class="line"><span class="cl"><span class="na">return 402;</span>
</span></span><span class="line"><span class="cl"><span class="na">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">location /weixin {</span>
</span></span><span class="line"><span class="cl"><span class="c1"># try_files $uri @proxy_to_app;</span>
</span></span><span class="line"><span class="cl"><span class="na">return 402;</span>
</span></span><span class="line"><span class="cl"><span class="na">}</span>
</span></span><span class="line"><span class="cl"><span class="na">location @proxy_to_app {</span>
</span></span><span class="line"><span class="cl"><span class="na">proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</span>
</span></span><span class="line"><span class="cl"><span class="na">proxy_set_header Host $http_host;</span>
</span></span><span class="line"><span class="cl"><span class="na">proxy_redirect off;</span>
</span></span><span class="line"><span class="cl"><span class="na">proxy_pass http://gunicorn_server;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">}</span>
</span></span><span class="line"><span class="cl"><span class="na">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#mail {</span>
</span></span><span class="line"><span class="cl"><span class="c1">#	# See sample authentication script at:</span>
</span></span><span class="line"><span class="cl"><span class="c1">#	# http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="c1">#	# auth_http localhost/auth.php;</span>
</span></span><span class="line"><span class="cl"><span class="c1">#	# pop3_capabilities &#34;TOP&#34; &#34;USER&#34;;</span>
</span></span><span class="line"><span class="cl"><span class="c1">#	# imap_capabilities &#34;IMAP4rev1&#34; &#34;UIDPLUS&#34;;</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="c1">#	server {</span>
</span></span><span class="line"><span class="cl"><span class="c1">#		listen     localhost:110;</span>
</span></span><span class="line"><span class="cl"><span class="c1">#		protocol   pop3;</span>
</span></span><span class="line"><span class="cl"><span class="c1">#		proxy      on;</span>
</span></span><span class="line"><span class="cl"><span class="c1">#	}</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="c1">#	server {</span>
</span></span><span class="line"><span class="cl"><span class="c1">#		listen     localhost:143;</span>
</span></span><span class="line"><span class="cl"><span class="c1">#		protocol   imap;</span>
</span></span><span class="line"><span class="cl"><span class="c1">#		proxy      on;</span>
</span></span><span class="line"><span class="cl"><span class="c1">#	}</span>
</span></span><span class="line"><span class="cl"><span class="c1">#}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>里面实在有太多的注释了，虽说是很好的参考，但是看多了会感觉很碍眼，所以你希望可以有一份没有注释的配置文件，你就可以使用 <strong>grep</strong> 和参数 <strong>-v</strong>:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">egrep -v <span class="s2">&#34;#|^</span>$<span class="s2">&#34;</span> /etc/nginx/nginx.conf &gt;/tmp/nging.conf
</span></span></code></pre></td></tr></table>
</div>
</div><p>结果如下：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span><span class="lnt">55
</span><span class="lnt">56
</span><span class="lnt">57
</span><span class="lnt">58
</span><span class="lnt">59
</span><span class="lnt">60
</span><span class="lnt">61
</span><span class="lnt">62
</span><span class="lnt">63
</span><span class="lnt">64
</span><span class="lnt">65
</span><span class="lnt">66
</span><span class="lnt">67
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-cfg" data-lang="cfg"><span class="line"><span class="cl"><span class="na">worker_processes auto;</span>
</span></span><span class="line"><span class="cl"><span class="na">pid /run/nginx.pid;</span>
</span></span><span class="line"><span class="cl"><span class="na">include /etc/nginx/modules-enabled/*.conf;</span>
</span></span><span class="line"><span class="cl"><span class="na">events {</span>
</span></span><span class="line"><span class="cl"><span class="na">worker_connections 1024;</span>
</span></span><span class="line"><span class="cl"><span class="na">}</span>
</span></span><span class="line"><span class="cl"><span class="na">http {</span>
</span></span><span class="line"><span class="cl"><span class="na">sendfile on;</span>
</span></span><span class="line"><span class="cl"><span class="na">tcp_nopush on;</span>
</span></span><span class="line"><span class="cl"><span class="na">tcp_nodelay on;</span>
</span></span><span class="line"><span class="cl"><span class="na">keepalive_timeout 65;</span>
</span></span><span class="line"><span class="cl"><span class="na">types_hash_max_size 2048;</span>
</span></span><span class="line"><span class="cl"><span class="na">include /etc/nginx/mime.types;</span>
</span></span><span class="line"><span class="cl"><span class="na">default_type application/octet-stream;</span>
</span></span><span class="line"><span class="cl"><span class="na">ssl_prefer_server_ciphers on;</span>
</span></span><span class="line"><span class="cl"><span class="na">log_format main &#39;$remote_addr - $remote_user [$time_local] &#34;$request&#34; $status $bytes_sent &#34;$http_referer&#34; &#34;$http_user_agent&#34; &#34;$gzip_ratio&#34;&#39;;</span>
</span></span><span class="line"><span class="cl"><span class="na">access_log /var/log/nginx/access.log;</span>
</span></span><span class="line"><span class="cl"><span class="na">error_log /var/log/nginx/error.log;</span>
</span></span><span class="line"><span class="cl"><span class="na">gzip on;</span>
</span></span><span class="line"><span class="cl"><span class="na">gzip_disable &#34;msie6&#34;;</span>
</span></span><span class="line"><span class="cl"><span class="na">include /etc/nginx/conf.d/*.conf;</span>
</span></span><span class="line"><span class="cl"><span class="na">include /etc/nginx/sites-enabled/*;</span>
</span></span><span class="line"><span class="cl"><span class="na">ignore_invalid_headers on;</span>
</span></span><span class="line"><span class="cl"><span class="na">client_header_timeout 240;</span>
</span></span><span class="line"><span class="cl"><span class="na">client_body_timeout 240;</span>
</span></span><span class="line"><span class="cl"><span class="na">send_timeout 240;</span>
</span></span><span class="line"><span class="cl"><span class="na">client_max_body_size 100m;</span>
</span></span><span class="line"><span class="cl"><span class="na">proxy_buffer_size 128k;</span>
</span></span><span class="line"><span class="cl"><span class="na">proxy_buffers 8 128k;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">upstream tomcat_server{</span>
</span></span><span class="line"><span class="cl"><span class="na">server 127.0.0.1:8080 fail_timeout</span><span class="o">=</span><span class="s">0;</span>
</span></span><span class="line"><span class="cl"><span class="na">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">upstream gunicorn_server{</span>
</span></span><span class="line"><span class="cl"><span class="na">server 127.0.0.1:5000 fail_timeout</span><span class="o">=</span><span class="s">0;</span>
</span></span><span class="line"><span class="cl"><span class="na">}</span>
</span></span><span class="line"><span class="cl"><span class="na">server{</span>
</span></span><span class="line"><span class="cl"><span class="na">server_name 127.0.0.1;</span>
</span></span><span class="line"><span class="cl"><span class="na">listen 443;</span>
</span></span><span class="line"><span class="cl"><span class="na">location / {</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">proxy_set_header X-Forwarded-Host $host;</span>
</span></span><span class="line"><span class="cl"><span class="na">proxy_set_header X-Forwarded-Server $host;</span>
</span></span><span class="line"><span class="cl"><span class="na">proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</span>
</span></span><span class="line"><span class="cl"><span class="na">proxy_pass http://tomcat_server;</span>
</span></span><span class="line"><span class="cl"><span class="na">proxy_set_header X-Forwarded-Proto https;</span>
</span></span><span class="line"><span class="cl"><span class="na">proxy_redirect off;</span>
</span></span><span class="line"><span class="cl"><span class="na">proxy_connect_timeout      240;</span>
</span></span><span class="line"><span class="cl"><span class="na">proxy_send_timeout         240;</span>
</span></span><span class="line"><span class="cl"><span class="na">proxy_read_timeout         240;</span>
</span></span><span class="line"><span class="cl"><span class="na">}</span>
</span></span><span class="line"><span class="cl"><span class="na">location /test{</span>
</span></span><span class="line"><span class="cl"><span class="na">return 402;</span>
</span></span><span class="line"><span class="cl"><span class="na">}</span>
</span></span><span class="line"><span class="cl"><span class="na">location /weixin {</span>
</span></span><span class="line"><span class="cl"><span class="na">return 402;</span>
</span></span><span class="line"><span class="cl"><span class="na">}</span>
</span></span><span class="line"><span class="cl"><span class="na">location @proxy_to_app {</span>
</span></span><span class="line"><span class="cl"><span class="na">proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</span>
</span></span><span class="line"><span class="cl"><span class="na">proxy_set_header Host $http_host;</span>
</span></span><span class="line"><span class="cl"><span class="na">proxy_redirect off;</span>
</span></span><span class="line"><span class="cl"><span class="na">proxy_pass http://gunicorn_server;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">}</span>
</span></span><span class="line"><span class="cl"><span class="na">}</span>
</span></span><span class="line"><span class="cl"><span class="na">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>egrep</strong> 是 <strong>grep</strong> 的扩展，你也可以通过 <strong>-E</strong> 使用扩展功能。就这样，你就可以得到一份很“干净”的配置文件了。</p>
<h2 id="小结"><span class="section-num">5</span> 小结</h2>
<p>在以前 <strong>grep</strong> 是 <strong>hacker</strong> 工具箱里面审查源代码必不可少的工具之一，但是随着技术的发展，似乎对比其他同类型的工具， <strong>grep</strong> 的性能已经难尽人意，特别是对比 <strong>ag</strong> 这个搜索神器；</p>
<p>虽说很多人都已经转移到了 <strong>ag</strong> 阵营，但是因为 <strong>grep</strong> 被广泛预装到各类的Linux/Unix 机器，所以 <strong>grep</strong> 还是使用得很广泛滴。</p>
<p>更多 <strong>grep</strong> 的用法就需要查询手册了：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">man grep
</span></span></code></pre></td></tr></table>
</div>
</div><p>Enjoy Shell :)</p>
<div center class="qr-container">
<img src="/ox-hugo/qrcode_gh_e06d750e626f_1.jpg" alt="qrcode_gh_e06d750e626f_1.jpg" width="160px" height="160px" center="t" class="qr-container" />
公号同步更新，欢迎关注👻
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Linux/Unix Shell 二三事之过滤器diff</title>
      <link>https://ramsayleung.github.io/zh/post/2017/diff/</link>
      <pubDate>Tue, 28 Feb 2017 00:00:00 -0800</pubDate>
      <guid>https://ramsayleung.github.io/zh/post/2017/diff/</guid>
      <description>An introduction about diff</description>
      <content:encoded><![CDATA[<blockquote>
<p>diff - compare files line by line</p></blockquote>
<p>如果你有使用过git,那么你一定不会对diff 陌生，因为对你源文件和修改后的文件进行比较的就是 <strong>diff</strong> 这个大名鼎鼎的家伙了。</p>
<p>多年以来， <strong>diff</strong> 都一直是非常重要的工具，上古大神 都是使用 <strong>diff</strong> 和 <strong>patch</strong> 对程序进行差分和打补丁滴(现在有git了，但是diff同样发挥着重要作用)</p>
<h2 id="语法"><span class="section-num">1</span> 语法</h2>
<p>diff 的语法如下</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">diff <span class="o">[</span>OPTION<span class="o">]</span>.... file1 file2
</span></span></code></pre></td></tr></table>
</div>
</div><p><em>OPTION</em> 指不同的选项参数，file1,file2 是文本文件的名字，如果比较的两个文件相同 diff 将不输出任何东西。如果两个文件有差异，diff 会显示一系列的指示，让你可以把第一个文件修改为与第二个文件一致</p>
<h2 id="例子"><span class="section-num">2</span> 例子</h2>
<h3 id="用法一"><span class="section-num">2.1</span> 用法一</h3>
<p>现在有两个文件，分别保存着不同的地址。
address1 包含：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">guangdong
</span></span><span class="line"><span class="cl">shanghai
</span></span><span class="line"><span class="cl">beijing
</span></span><span class="line"><span class="cl">chengdu
</span></span></code></pre></td></tr></table>
</div>
</div><p>address2 包含：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">guangdong
</span></span><span class="line"><span class="cl">shanghai
</span></span><span class="line"><span class="cl">beijin
</span></span><span class="line"><span class="cl">chengdu
</span></span></code></pre></td></tr></table>
</div>
</div><p>你可以注意到两个文件的区别就是第三行的 <em>beijing</em>.然后运行 <strong>diff</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">diff address1 address2
</span></span></code></pre></td></tr></table>
</div>
</div><p>输出结果：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">3c3
</span></span><span class="line"><span class="cl">&lt; beijing
</span></span><span class="line"><span class="cl">---
</span></span><span class="line"><span class="cl">&gt; beijin
</span></span></code></pre></td></tr></table>
</div>
</div><p>似乎有点难以理解，输出结果描述了什么呢？其实diff 是在指导如何修改不同的文件使之一致 <strong>&lt;</strong> 后接的是文件1中与文件2不同的部分， <strong>&gt;</strong> 后接的是文件2中与文件1不同的部分</p>
<p>diff 的输出使用3个不同的单字符指导：a(append,追加),c(change,修改),d(delete,删除). 在上面的例子，只是看到一个 <em>c</em>,意味着，如果想把 <em>address1</em> 修改成 <em>address2</em> 只需将 <em>address1</em> 的第三行修改成 <em>address2</em> 的第三行</p>
<h3 id="用法2"><span class="section-num">2.2</span> 用法2</h3>
<p>现在把 <em>address2</em> 的最后一行删除，看看运行 <em>diff</em> 结果如何：
address1 包含：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">guangdong
</span></span><span class="line"><span class="cl">shanghai
</span></span><span class="line"><span class="cl">beijing
</span></span><span class="line"><span class="cl">chengdu
</span></span></code></pre></td></tr></table>
</div>
</div><p>address2 包含：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">guangdong
</span></span><span class="line"><span class="cl">shanghai
</span></span><span class="line"><span class="cl">beijing
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">diff address1 address2
</span></span></code></pre></td></tr></table>
</div>
</div><p>输出结果：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">4d3
</span></span><span class="line"><span class="cl">&lt; chengdu
</span></span></code></pre></td></tr></table>
</div>
</div><p>在该例子中，为了将 <em>address1</em> 变成 <em>address2</em> 只需删除 <em>address1</em> 的第四行</p>
<h3 id="用法3"><span class="section-num">2.3</span> 用法3</h3>
<p>现在把 <em>address1</em> 的最后一行删除，看看运行 <em>diff</em> 结果如何：
address1 包含：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">guangdong
</span></span><span class="line"><span class="cl">shanghai
</span></span><span class="line"><span class="cl">beijing
</span></span></code></pre></td></tr></table>
</div>
</div><p>address2 包含：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">guangdong
</span></span><span class="line"><span class="cl">shanghai
</span></span><span class="line"><span class="cl">beijing
</span></span><span class="line"><span class="cl">chengdu
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">diff address1 address2
</span></span></code></pre></td></tr></table>
</div>
</div><p>输出结果：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">3a4
</span></span><span class="line"><span class="cl">&gt; chengdu
</span></span></code></pre></td></tr></table>
</div>
</div><p>想将第一个文件转换成第二个文件，只需在第一个文件追加第二个文件的第四行(即在第一个文件的第 <strong>3</strong> 行之后追加第二个文件的第 <strong>4</strong> 行)</p>
<h2 id="diff-选项"><span class="section-num">3</span> diff 选项</h2>
<p>因为diff 是一个相当强大也是一个相当复杂的命令，所以我没办法将所有的用法一一道
尽所以笔者将比较常用的选项列举出来</p>
<ul>
<li><strong>-b</strong>:忽略制表符(不忽略所有的空白符，指忽略空白符数量的差异),例如下面的两行是相同的</li>
</ul>
<!--listend-->
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">a    a
</span></span><span class="line"><span class="cl">a a
</span></span></code></pre></td></tr></table>
</div>
</div><ul>
<li><strong>-B(blank lines)</strong>:忽略所有的空白行</li>
<li><strong>-c(context)</strong>:以上下文的形式显示差异内容，对比默认输出更加容易理解(但是也更加繁杂)</li>
<li><strong>-q(quiet)</strong>: diff 静默设置，即如果文件file1和file2有差异，diff 也只会显示 <em>File file1 and file2 differ</em></li>
<li><strong>-w(whitespace)</strong>:忽略所有的空白符</li>
<li><strong>-u(unified output)</strong>: 上下文形式显示的改进，不会输出重复行</li>
<li><strong>-y</strong>:将文件分成两列或多列并排进行输出(非常直观，但是输出很繁杂)</li>
</ul>
<p>还是老话，更多的用法就需要：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">man diff
</span></span></code></pre></td></tr></table>
</div>
</div><div center class="qr-container">
<img src="/ox-hugo/qrcode_gh_e06d750e626f_1.jpg" alt="qrcode_gh_e06d750e626f_1.jpg" width="160px" height="160px" center="t" class="qr-container" />
公号同步更新，欢迎关注👻
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Linux/Unix Shell 二三事之过滤器cat</title>
      <link>https://ramsayleung.github.io/zh/post/2017/cat/</link>
      <pubDate>Wed, 22 Feb 2017 00:00:00 -0800</pubDate>
      <guid>https://ramsayleung.github.io/zh/post/2017/cat/</guid>
      <description>An introduction about cat</description>
      <content:encoded><![CDATA[<blockquote>
<p>cat - concatenate files and print on the standard output</p></blockquote>
<h2 id="过滤器"><span class="section-num">1</span> 过滤器</h2>
<p>何谓过滤器呢，例如cat,grep,wl 之类的命令就是过滤器了。这样的命令
读取数据，对数据执行一些操作，然后写入结果。更准确地说，过滤器就是任何能够从标准
输入读取 <strong>文本</strong> 数据，并向标准输出写入 <strong>文本</strong> 数据的命令。又因为Unix 的 <strong>KISS</strong>
设计理念，所以每个程序都被设计成能够出色完成一项特定任务的工具。又因为重定向和
管道的存在，使得可以将这些工具组合起来，发挥无穷威力</p>
<h2 id="cat"><span class="section-num">2</span> cat</h2>
<p>在shell 里面运行cat,你会被要求输入文本数据，当你输入一行数据以后，然后按下回
车你输入的数据就会显示在屏幕，当你按下 ^D(&lt;ctrl&gt;+d),发送eof 信号给shell,退出
cat。cat 做的事就是把你输入的字符，复制到标准输出 (一般情况是指你的屏幕).看到
这里有人或许会质疑，这东西有什么用呢？似乎什么都作不了。不，它的用处很大呢，
且容笔者细细禀来</p>
<h3 id="场景1"><span class="section-num">2.1</span> 场景1</h3>
<p>假如你要新建一个文本文件，里面只是很少的文本，你会怎么做呢？一般情况下，都是用
vim/emacs 新建一个文本文件，然后输入几行文字，然后保存退出。这是一般的做法，
看到这里，很自然有人会发问，难道有更优雅的解决方法？有，不用打开文本编辑器写入文本
的hacking方法：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">cat &gt; data
</span></span></code></pre></td></tr></table>
</div>
</div><p>输入数据，然后 ^D(&lt;ctrl&gt;+d) 保存。你就新建了一个文本了。当然，如果你已经有一个 <strong>data</strong> 文件
,就会被代替，当然，你也可以也在原来文本末尾添加的方法：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">cat &gt;&gt; data
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="场景2"><span class="section-num">2.2</span> 场景2</h3>
<p>如果你有一个短文件，你想查看一下，同样，你可以使用cat</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">cat &lt; data
</span></span></code></pre></td></tr></table>
</div>
</div><p>当然，你也可以省略 <strong>&lt;</strong> 这个重定向符号：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">cat data
</span></span></code></pre></td></tr></table>
</div>
</div><p>抑或是，你想显示某个大文件的最后一部分，你也可以如上操作。或许你会觉得，这个功能
很多命令也有，最典型的就是 <strong>tail</strong>. 但是如果 <strong>cat</strong> 可以很完美地很其他过滤器结合
充当整套管道线工具流的起始端，这个以后慢慢再阐述</p>
<h3 id="场景3"><span class="section-num">2.3</span> 场景3</h3>
<p>如果你想复制文本文件，你首先会想起什么命令？ <strong>cp</strong>,很自然嘛，我也不例外，但是cat
也可以实现同样的功能，很意外吧：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">cat &lt; file &gt; newfile
</span></span></code></pre></td></tr></table>
</div>
</div><p>即把 <strong>file</strong> 复制到标准输出，然后再把 <strong>file</strong> 当作标准输入复制到 <strong>newfile</strong>.hacking!</p>
<h3 id="场景4"><span class="section-num">2.4</span> 场景4</h3>
<p>如果你想把多个文本文件的组合到一个文件，你会怎么做？用编辑器打开所有的文件
然后 select,cut,paste,save.我也会很自然地想到这个方法，但是是否存在着更
优雅的解决方案呢？当然：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">cat file1 file2 file3 &gt;newfile
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="总结"><span class="section-num">3</span> 总结</h2>
<p>上面已经介绍了挺多cat 的使用场景了，你觉得cat 表现滴怎么样呢？相信你的感觉是
还行，但是并没有，我吹嘘的那么令人惊艳。因为这只是cat 最基本的功能，它最大的
用法还没有完全展现出来，笔者先举一例，以后再慢慢详叙：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">cat file <span class="p">|</span>grep <span class="s2">&#34;something&#34;</span> <span class="p">|</span>sort -n <span class="p">|</span>tee newfile
</span></span></code></pre></td></tr></table>
</div>
</div><table>
  <thead>
      <tr>
          <th>语法</th>
          <th>用法</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>cat &gt; file</td>
          <td>读取输入，创建新的文件或替换</td>
      </tr>
      <tr>
          <td>cat &gt;&gt;file</td>
          <td>读取输入，追加新的文件</td>
      </tr>
      <tr>
          <td>cat file/cat &lt;file</td>
          <td>显示一个已有文件</td>
      </tr>
      <tr>
          <td>cat &lt;oldfile&gt; newfile</td>
          <td>复制一个文件</td>
      </tr>
      <tr>
          <td>cat file1 file2 file3&gt;file4</td>
          <td>组合多个文件</td>
      </tr>
  </tbody>
</table>
<div center class="qr-container">
<img src="/ox-hugo/qrcode_gh_e06d750e626f_1.jpg" alt="qrcode_gh_e06d750e626f_1.jpg" width="160px" height="160px" center="t" class="qr-container" />
公号同步更新，欢迎关注👻
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Linux/Unix Shell 二三事之过滤器head&#43;tail</title>
      <link>https://ramsayleung.github.io/zh/post/2017/head_tail/</link>
      <pubDate>Fri, 17 Feb 2017 00:00:00 -0800</pubDate>
      <guid>https://ramsayleung.github.io/zh/post/2017/head_tail/</guid>
      <description>An introduction about head and tail</description>
      <content:encoded><![CDATA[<blockquote>
<p>head - output the first part of files
tail - output the last part of files</p></blockquote>
<p>当拥有的数据太多的时候，使用cat 来展示数据的话，数据量过大，屏幕就只能显示最后一部分的数据了。</p>
<p>所以如果你想选取部分的数据的话，cat 就不是一个好选择了。有两个命令可以满足你的要求，分别是 <strong>head</strong> 和 <strong>tail</strong>.顾名思义，head 选取数据的开头部分tail 是选取数据的结尾部分</p>
<h2 id="用法"><span class="section-num">1</span> 用法</h2>
<p>当把 <strong>head</strong> <strong>tail</strong> 当作过滤器来使用的时候，用法很简单</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ head data
</span></span><span class="line"><span class="cl">$ tail data
</span></span></code></pre></td></tr></table>
</div>
</div><p>默认情况下 <strong>head</strong> 会选取数据开头的10行数据 <strong>tail</strong> 会选取数据最后的10行数据. 如果你想选取更多的数据的时候，你可以指定行数，例如</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ head <span class="o">[</span>-n line<span class="o">]</span> data
</span></span><span class="line"><span class="cl">$ tail <span class="o">[</span>-n line<span class="o">]</span> data
</span></span></code></pre></td></tr></table>
</div>
</div><p>其中 line 是希望选取的数据行的数量</p>
<h2 id="惊艳点"><span class="section-num">2</span> 惊艳点</h2>
<p>你可能觉得 <strong>head</strong> <strong>tail</strong> 两个命令很简单，似乎用处不大。</p>
<p>是的，就我一直所介绍的那样，单个unix命令只是完成一个特定的工作，但是当它们组合起来的时候，就很威力无穷了</p>
<h3 id="场景1"><span class="section-num">2.1</span> 场景1</h3>
<p>假如你要生成一串密钥来加密你的某个文件，这是很常见的需求，你会怎么办，用python 或者 java 写一个随机数函数来实现么？无需，你用简单的过滤器加Linux/Unix</p>
<p>内置的设备(dev):</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ cat /dev/urandom <span class="p">|</span> tr -cd <span class="s2">&#34;[[:alnum:]]&#34;</span> <span class="p">|</span>head -c 32<span class="p">;</span><span class="nb">echo</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>在Unix/Linux 的机器下，运行上面的命令就可以生成一个包含数字和字母的32个字符长的密钥了。</p>
<p>/dev/urandom 是一个可以通过收集硬件驱动的环境噪音来产生伪随机数特殊的文件，tr 是转换和删除字符的命令；更多详细的东西，以后我会慢慢介绍滴</p>
<h3 id="场景2"><span class="section-num">2.2</span> 场景2</h3>
<p>在日常的开发或者运行环境中，日志是必不可少滴，但是日志是不断产生新的数据的,所以有时候就会出现用编辑器打开日志的时候，就会出现，编辑器不断提醒你文件已经发生了变化，是否重新加载，但是如果只是用cat,tail 来查看日志，日志又是保持在
打开的那个状态，新产生的日志数据是没办法浏览到，果真如此？</p>
<p>其实不然, tail 可以在查看日志的时候，保持日志一直在更新。关键就在 <strong>-f</strong> 选项</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ tail -f <span class="o">[</span>-n line<span class="o">]</span> file
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>-f</strong> 选项告诉tail 当到达文件的末尾不要停止。相反，tail 要一直等下去，并且随着文件的增长，显示更多的输出 (-f -&gt; follow)</p>
<p>你也可以模拟日志不断生成的过程：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ tail -f -n <span class="m">20</span> something.log
</span></span></code></pre></td></tr></table>
</div>
</div><p>然后打开一个新的Shell, 运行：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">cat &gt;&gt; something.log
</span></span></code></pre></td></tr></table>
</div>
</div><p>使用 <strong>&gt;&gt;</strong> 追加数据，就可以模拟日志生成的过程了</p>
<h2 id="总结"><span class="section-num">3</span> 总结</h2>
<p>要掌握更多的用法还是要查看文档滴：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">man head
</span></span></code></pre></td></tr></table>
</div>
</div><p>Enjoy Shell :)</p>
<div center class="qr-container">
<img src="/ox-hugo/qrcode_gh_e06d750e626f_1.jpg" alt="qrcode_gh_e06d750e626f_1.jpg" width="160px" height="160px" center="t" class="qr-container" />
公号同步更新，欢迎关注👻
</div>
]]></content:encoded>
    </item>
  </channel>
</rss>
