【问题标题】:what does this bash script line of code mean这段 bash 脚本代码行是什么意思
【发布时间】:2017-11-16 10:24:33
【问题描述】:

我是 shell 脚本的新手,我在给定的脚本中发现了以下代码行。

谁能用一个例子解释一下下面这行代码的含义

Path=`echo $line | awk -F '|' '{print $1}'`

【问题讨论】:

  • 此命令打印管道分隔字符串的第一块。 echo 'ciorgio|fjshs|dsjusj|hjdhs' | awk -F '|' '{print $1}' 打印“ciorgio”

标签: shell awk pipe


【解决方案1】:

echo $line 将打印变量$line 的值,| 符号表示此的输出将被传递(或piped)到另一个程序/命令/脚本。我不会在这里解释awk,但上面所做的就是将echo $line 的输出用它来处理。
根据 awk 手册页的选项 -FS 意味着

-F fs 使用 fs 作为输入字段分隔符

所以后面的字符串将用于将给 awk 的输入字符串拆分为不同的字段。例如,您的变量$line 的值为a|b,它将分为两个字段ab。在'{}' 表达式中指定了要执行的操作。 同样,可以在其中完成的操作几乎是无限的,这里唯一要做的就是打印可以使用$1 访问的第一个字段,或者在上面的示例中使用a($2 将是b可以猜到)。

最后,整个操作的输出然后存储在变量Path 中。

总结一下:

line="a|b"
echo $line | awk -F '|' '{print $1}'
> a
Path=`echo $line | awk -F '|' '{print $1}'`
echo $Path
> a

【讨论】:

  • awk 是 awk 编程语言的程序或解释器。您可以使用各种参数调用此程序来控制其行为。我试图在我的回答中解释-F 选项。
【解决方案2】:
echo $line | awk -F '|' '{print $1}'

解释:

echo -> display a line of text
$line -> parameter expansion read the line
| -> A  pipeline is a sequence of one or more commands separated by one of the control operators |
awk -> Invoke awk program
-F '|' -> Field separator as | for the data feed
'{print $1}' -> Print the first field

例子

echo 'a|b|c' | awk -F '|' '{print $1}'

将打印a

【讨论】:

    【解决方案3】:

    我认为这只是一种复杂的表达方式

     echo ${line%%|*}
    

    即将变量line 的部分内容写入标准输出,该部分内容最多(但不包括)第一个竖线。

    【讨论】:

      【解决方案4】:
      Path=`echo $line | awk -F '|' '{print $1}'`
       ^           ^             ^           ^
       |           |             |           |
       |           |             |           print 1st column
       |           |             |
       |           |           input field separator
       |           |
       |          echo variable line
       | 
      variable Path
      
      • -F'|' - 默认情况下,awk 按单个空格将记录/行/行拆分为列,但使用|,awk 按管道拆分

      以上可以写成

      Path=$( awk -F '|' '{ print $1 }' <<< "$line" )
      

      假设说

      $ line="1|2|3"
      $ Path=$( awk -F '|' '{ print $1 }' <<< "$line" )
      $ echo $Path; # you get first column
      1
      

      $ Path=$( cut -d'|' -f1 <<< "$line" )
      $ echo $Path;
      1
      

      【讨论】:

        【解决方案5】:

        默认字段分隔符是'',如果你有-F,意味着将默认分隔符更改为'|'

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多