Awk 如何在bash中从文件中提取字符串

Awk 如何在bash中从文件中提取字符串,awk,Awk,我有一个名为DB_create.sql的文件,其中有一行 CREATE DATABASE testrepo; 我只想从中提取testrepo。所以我试过了 cat DB_create.sql | awk'{print$3}' 这给了我testrepo 我只需要testrepo。如何获取此信息?对于您展示的样本,请尝试以下内容 awk -F'[ ;]' '{print $(NF-1)}' DB_create.sql 或 或者在不设置任何字段分隔符的情况下,尝试: awk '{sub(/;$/,

我有一个名为DB_create.sql的文件,其中有一行

CREATE DATABASE testrepo;
我只想从中提取testrepo。所以我试过了

cat DB_create.sql | awk'{print$3}'

这给了我testrepo


我只需要testrepo。如何获取此信息?

对于您展示的样本,请尝试以下内容

awk -F'[ ;]' '{print $(NF-1)}' DB_create.sql

或者在不设置任何字段分隔符的情况下,尝试:

awk '{sub(/;$/,"");print $3}'  DB_create.sql

简单的解释是:将字段分隔符设置为空格或分号,然后打印OP此处要求的最后第二个字段
($NF-1)
。另外,您不需要对
awk
使用
cat
命令,因为
awk
可以自己读取输入文件。

对于所显示的示例,请尝试以下操作

awk -F'[ ;]' '{print $(NF-1)}' DB_create.sql

或者在不设置任何字段分隔符的情况下,尝试:

awk '{sub(/;$/,"");print $3}'  DB_create.sql
简单的解释是:将字段分隔符设置为空格或分号,然后打印OP此处要求的最后第二个字段
($NF-1)
。另外,您不需要将
cat
命令与
awk
一起使用,因为
awk
可以自己读取输入文件。

您可以使用

awk-F'[;[:space:]+'{print$3}'DB_create.sql
其中,字段分隔符设置为与一个或多个
匹配的
[;[:space:]+
正则表达式或/和空白字符。然后,字段3将包含不带分号的字符串

更多图案细节:

  • [
    -括号表达式的开头
    • -a
      字符
    • [:space:
      -任何空格字符
  • ]
    -括号表达式的末尾
  • +
    -一个POSIX ERE一个或多个事件量词
请参阅。

您可以使用

awk-F'[;[:space:]+'{print$3}'DB_create.sql
其中,字段分隔符设置为与一个或多个
匹配的
[;[:space:]+
正则表达式或/和空白字符。然后,字段3将包含不带分号的字符串

更多图案细节:

  • [
    -括号表达式的开头
    • -a
      字符
    • [:space:
      -任何空格字符
  • ]
    -括号表达式的末尾
  • +
    -一个POSIX ERE一个或多个事件量词

请参阅。

使用
gnu awk
,您可以将记录分隔符设置为
+换行符:

awk-vrs=”\r?\n“{print$3}”file.sql
测试报告
或者使用任何POSIX awk,只需调用
sub
,即可去除尾随

awk'{sub(/;$/,“”,$3);print$3}'file.sql
测试报告

使用
gnu awk
,您可以将记录分隔符设置为
+换行符:

awk-vrs=”\r?\n“{print$3}”file.sql
测试报告
或者使用任何POSIX awk,只需调用
sub
,即可去除尾随

awk'{sub(/;$/,“”,$3);print$3}'file.sql
测试报告

使用您自己的代码,但添加函数
sub()

尽管最好不要使用
cat
。在这里您可以看到原因:

所以最好这样:

awk '{sub(/;$/, "",$3);print $3}' file

使用您自己的代码,但添加函数
sub()

尽管最好不要使用
cat
。在这里您可以看到原因:

所以最好这样:

awk '{sub(/;$/, "",$3);print $3}' file

我认为AWK不是这里最合适的工具。我会使用sed:
sed-n'/^createdatabase\(.*)$/s//\1/p'DB\u create.sql
。但即使这样也很脆弱,因为它不理解SQL,它只是逐字逐句地查找字符匹配。这在紧要关头是可以的,但是一个健壮的解决方案需要一个SQL解析器。我不认为AWK是这里最合适的工具。我会使用sed:
sed-n'/^createdatabase\(.*)$/s//\1/p'DB\u create.sql
。但即使这样也很脆弱,因为它不理解SQL,它只是逐字逐句地查找字符匹配。这在紧要关头很好,但是一个健壮的解决方案需要一个SQL解析器。