Переменные в awk не работают в switch / case - PullRequest
0 голосов
/ 26 февраля 2019

Я пишу сценарий, который может создать правило прокси из файла CSV.

#!/usr/bin/env bash

awk -F', ' '
  function head (soft, keyword) {
    if (soft == "clash") {
      switch (keyword) {
        case "HOST":
          rule_head = "- DOMAIN";
          break;
        case "KEYWORD":
          rule_head = "- DOMAIN-KEYWORD";
          break;
        case "SUFFIX":
          rule_head = "- DOMAIN-SUFFIX";
          break;
        case "IP-CIDR":
          rule_head = "- IP-CIDR";
          break;
      }
    } else
    if (soft == "quant") {
      switch (keyword) {
        case "HOST":
          rule_head = "HOST";
          break;
        case "KEYWORD":
          rule_head = "HOST-KEYWORD";
          break;
        case "SUFFIX":
          rule_head = "HOST-SUFFIX";
          break;
        case "IP-CIDR":
          rule_head = "IP-CIDR";
          break;
      }
    }
    ruturn rule_head;
  }

  function tail (soft, keyword) {
    if (soft == "clash") {
      switch (keyword) {
        case "REJECT":
          rule_tail = "REJECT";
          break;
        case "DIRECT":
          rule_tail = "DIRECT";
          break;
        case "jp_proxy":
          rule_tail = "Japan_Tokyo";
          break;
        case "us_proxy":
          rule_tail = "USA_Oregon";
          break;
        case "kr_proxy":
          rule_tail = "Korea_Seoul";
          break;
      }
    } else
    if (soft == "quant") {
      switch (keyword) {
        case "REJECT":
          rule_tail = "REJECT";
          break;
        case "DIRECT":
          rule_tail = "DIRECT,no-resolve";
          break;
        case "jp_proxy":
          rule_tail = "Japan - Tokyo";
          break;
        case "us_proxy":
          rule_tail = "USA - Oregon";
          break;
        case "kr_proxy":
          rule_tail = "Korea - Seoul";
          break;
      }
    }
    return rule_tail;
  }

  {
    if (NR>2) {
      printf "%s,%s,%s\n", head(clash, $2), $3 ,tail(clash, $4);
    }
  }
' Resources/exception.csv

и файла Resources / exception.csv

# group, type, basis, action, comment

china_list, KEYWORD, 360buy, DIRECT, No_comment
china_list, KEYWORD, baidu, DIRECT, No_comment
china_list, KEYWORD, bdstatic, DIRECT, No_comment
china_list, KEYWORD, bcebos, DIRECT, No_comment
proxy_list, KEYWORD, fbcdn, us_proxy, No_comment
proxy_list, KEYWORD, twitter, us_proxy, No_comment
proxy_list, KEYWORD, twimg, us_proxy, No_comment

и вывод оболочки

,360buy,
,baidu,
,bdstatic,
,bcebos,
,fbcdn,
,twitter,
,twimg,

rule_head и rule_tail , кажется, не работает вообще, я уже пытался напечатать ключевое слово внутри функциональной головы илиtail> если до switch / case , он может правильно напечатать ключевое слово.

Но когда я попытался напечатать rule_head или rule_tail после переключателя /регистр выводится с пометкой

1 Ответ

0 голосов
/ 26 февраля 2019

Не могли бы вы попробовать изменить либо (я за рулем, поэтому не тестировал его, но должен работать, если у вашего кода нет проблем с синтаксисом)

head(clash, $2), $3 ,tail(clash, $4); ----> head("clash", $2), $3 ,tail("clash", $4);.

ИЛИ вы можете создать переменную с awk -v value="clash", чтобы сохранить ее только в формате переменной.Затем упомяните:

head(value, $2), $3 ,tail(value, $4);

@ JoshuaLee.упоминание чего-либо внутри " двойных кавычек означает, что мы являемся значением упоминания, если вы хотите иметь переменную и присвоить ей значение, используйте var="bla" или вы хотите передать что-либо непосредственно без переменной и любое значение, тогда используйте print "bla", например, IЯ упоминаю здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...