AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-17307

Zombo's questions

Martin Hope
Zombo
Asked: 2018-11-25 06:41:05 +0800 CST

意外的拆分行为

  • 1

我在这里阅读了有关 Awk 拆分行为的信息:

[...] split函数的fs参数(参见字符串函数)应被解释为扩展的正则表达式。这些可以是ERE标记或任意表达式,并且应以与or运算符 右侧相同的方式进行解释。~!~

和:

如果右侧操作数是词法标记 ERE以外的任何表达式,则表达式的字符串值应解释为扩展的正则表达式,包括上述转义约定。

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html#tag_20_06_13_04

但是我注意到一个意想不到的结果,使用这段代码:

BEGIN {
  print split("te.st", q, ".")
}

我希望 the.代表任何字符,并且结果为6. 但是我所有的测试都返回了2。运行这段代码给出了预期的6:

BEGIN {
  print split("te.st", q, /./)
}

经测试:

  • 呆呆
  • gawk --posix
  • 1.3.4 版本
  • 1.3.3 版本
  • nawk(原始 awk)

我误解了文档还是这是一个错误?

awk posix
  • 1 个回答
  • 314 Views
Martin Hope
Zombo
Asked: 2018-08-31 18:36:11 +0800 CST

确定第一个字符串是否以第二个字符串开头

  • 5

JavaScript 有一个功能:

'world'.startsWith('w')
true

我怎样才能用shell测试这个?我有这个代码:

if [ world = w ]
then
  echo true
else
  echo false
fi

但它失败了,因为它正在测试平等。我更喜欢使用内置的,但此页面中的任何实用程序都是可以接受的:

http://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.html

shell test
  • 2 个回答
  • 11881 Views
Martin Hope
Zombo
Asked: 2018-08-19 06:46:08 +0800 CST

awk 缓冲区大小

  • 1

我今天注意到了这组有趣的命令:

$ seq 5 > alfa.txt
$ awk '{print 6 > ARGV[1]} 1' alfa.txt
1
2
3
4
5

$ cat alfa.txt
6
6
6
6
6

我的第一个问题是为什么我得到几个6而不是一个,但后来我记得你每次都需要关闭:

awk '{print 6 > ARGV[1]; close(ARGV[1])} 1' alfa.txt

然而,让我感到困惑的是,如果我从一开始就破坏输入,我怎么能仍然通过并阅读整个文件?我的猜测是,Awk 实际上是在写入缓冲区,然后在最后或者每次缓冲区填满时写入实际文件。

如果后者为真,那么缓冲区大小是多少?

awk command-line
  • 2 个回答
  • 584 Views
Martin Hope
Zombo
Asked: 2018-07-06 15:52:11 +0800 CST

cURL url_effective 与 Hash

  • 2

如果将此链接放在浏览器中:

https://unix.stackexchange.com/q/453740#453743

它返回这个:

https://unix.stackexchange.com/questions/453740/installing-busybox-for-ubuntu#453743

但是 cURL 会丢弃哈希:

$ curl -I https://unix.stackexchange.com/q/453740#453743
HTTP/2 302
cache-control: no-cache, no-store, must-revalidate
content-type: text/html; charset=utf-8
location: /questions/453740/installing-busybox-for-ubuntu

cURL 是否可以选择将哈希与结果 URL 一起保留?本质上,我正在尝试编写一个脚本,该脚本将像浏览器一样解析 URL - 这是我目前所拥有的,但如果 URL 包含哈希,它会中断:

$ set https://unix.stackexchange.com/q/453740#453743
$ curl -L -s -o /dev/null -w %{url_effective} "$1"
https://unix.stackexchange.com/questions/453740/installing-busybox-for-ubuntu
shell-script command-line
  • 2 个回答
  • 2664 Views
Martin Hope
Zombo
Asked: 2018-06-26 18:38:06 +0800 CST

检测可选函数参数(数组)

  • 2

考虑这个函数:

function add_one(in_ar,   each) {
  for (each in in_ar) {
    in_ar[each]++
  }
}

我想对其进行修改,以便如果提供了第二个数组,则将使用它而不是修改输入数组。我试过这个:

function add_one(in_ar, out_ar,   each) {
  if (out_ar) {
    for (each in in_ar) {
      out_ar[each] = in_ar[each] + 1
    }
  }
  else {
    for (each in in_ar) {
      in_ar[each]++
    }
  }
}
BEGIN {
  split("1 2 3 4 5", q)
  add_one(q, z)
  print z[3]
}

但我得到了这个结果:

fatal: attempt to use scalar `z' as an array
awk array
  • 1 个回答
  • 223 Views
Martin Hope
Zombo
Asked: 2018-05-13 09:47:58 +0800 CST

破折号“-nt”行为

  • 2

我能想到的用例是-nt,如果文件太旧或不存在,则更新文件。Bash 处理得很好:

$ bash -c 'touch 2.txt; sleep 1; touch 1.txt; [ 1.txt -nt 2.txt ]; echo $?;
[ 1.txt -nt 3.txt ]; echo $?'
0
0

但是,只有两个文件都存在时,Dash 才能按预期工作:

$ dash -c 'touch 2.txt; sleep 1; touch 1.txt; [ 1.txt -nt 2.txt ]; echo $?;
[ 1.txt -nt 3.txt ]; echo $?'
0
1

我试图理解 Dash 代码的逻辑。您可以像这样解决此行为:

$ dash -c 'touch 1.txt; [ ! -f 3.txt ] || [ 1.txt -nt 3.txt ]; echo $?'
0

但为什么需要这样做呢?为什么 Dash 会选择这个逻辑?在某些情况下使用 Dash 逻辑是否有意义?

shell timestamps
  • 1 个回答
  • 1053 Views
Martin Hope
Zombo
Asked: 2018-05-03 17:08:15 +0800 CST

“gcc_tooldir”在哪里

  • 3

在Cross-Compiler-Specific Options下,它说:

--with-sysroot如果没有给出参数, 默认值是${gcc_tooldir}/sys-root.

但似乎gcc_tooldir没有定义。这是其他东西的昵称吗?“通常”在哪里?

compiling gcc
  • 1 个回答
  • 274 Views
Martin Hope
Zombo
Asked: 2018-04-02 12:59:34 +0800 CST

标准输入:不是 tty

  • 2

有时标准输入(stdin)是一个终端:

$ tty
/dev/pts/0

有时不是:

$ echo hello | tty
not a tty

$ tty < /dev/null
not a tty

$ tty << eof
> hello
> eof
not a tty

当“stdin”不是终端时,它是什么?那个“非 tty”组是否有一个集体名称,或者他们都只是单独提及?

terminal pipe
  • 2 个回答
  • 6205 Views
Martin Hope
Zombo
Asked: 2018-04-01 06:22:47 +0800 CST

awk 检测标准输入

  • 0

Perl、Ruby 和 PHP 可以检测标准输入:

$ perl -e 'print -t ? "no stdin" : "stdin"'
no stdin

$ echo | perl -e 'print -t ? "no stdin" : "stdin"'
stdin

$ ruby -e 'puts $stdin.isatty ? "no stdin" : "stdin"'
no stdin

$ echo | ruby -e 'puts $stdin.isatty ? "no stdin" : "stdin"'
stdin

$ php -r 'print posix_isatty(STDIN) ? "no stdin" : "stdin";'
no stdin

$ echo | php -r 'print posix_isatty(STDIN) ? "no stdin" : "stdin";'
stdin

awk 有办法做到这一点吗?我尝试了 ARGC,但在这两种情况下都是一样的:

$ awk 'BEGIN {print ARGC == 1 ? "no stdin" : "stdin"}'
no stdin

$ echo | awk 'BEGIN {print ARGC == 1 ? "no stdin" : "stdin"}'
no stdin
awk terminal
  • 2 个回答
  • 489 Views
Martin Hope
Zombo
Asked: 2018-03-31 15:10:05 +0800 CST

真正退出 awk 脚本

  • 5

Perl 和 Rubyexit实际上退出了:

$ perl -e 'BEGIN {print 1; exit}; END {print 2}'
1

$ ruby -e 'BEGIN {print 1; exit}; END {print 2}'
1

对 awk 来说不是这样:

$ awk 'BEGIN {print 1; exit}; END {print 2}'
1
2

我试图用“help.awk”解决这个问题

function really_exit() {
  IM_SURE = 1
  exit
}
END {
  if (IM_SURE) {
    exit
  }
}

但这会产生自己的问题。如果“prog.awk”只有开始块:

BEGIN {
  print "start"
}

然后运行它:

awk -f help.awk -f prog.awk

将导致它挂起等待输入。是否有更好的解决方案可用于真正退出 Awk 脚本?

awk scripting
  • 1 个回答
  • 3904 Views
Martin Hope
Zombo
Asked: 2018-03-03 21:02:26 +0800 CST

硬包硬笔芯

  • 1

鉴于此文件:

$ cat file
alfa bravo charlie delta echo foxtrot golf hotel india juliet kilo lima mike
november oscar papa quebec romeo sierra tango
uniform_victor_whiskey_xray yankee zulu

我想硬断70,但我也想硬补。我试过“折叠”,但它没有重新填充:

$ fold -w 70 file
alfa bravo charlie delta echo foxtrot golf hotel india juliet kilo lim
a mike
november oscar papa quebec romeo sierra tango
uniform_victor_whiskey_xray yankee zulu

“fmt”会重新填充,但我只能让它在空格处中断,所以不能保证恰好在 70 处换行:

$ fmt file
alfa bravo charlie delta echo foxtrot golf hotel india juliet
kilo lima mike november oscar papa quebec romeo sierra tango
uniform_victor_whiskey_xray yankee zulu

我试过“pr”,但它似乎只是截断了这条线而不换行:

$ pr -t -W 70 file
alfa bravo charlie delta echo foxtrot golf hotel india juliet kilo lim
november oscar papa quebec romeo sierra tango
uniform_victor_whiskey_xray yankee zulu

也许这些命令有一些我遗漏的选项,或者可能是 Awk 或 Sed 解决方案。我宁愿避免更重的解决方案(Perl PHP Ruby)。

shell awk
  • 2 个回答
  • 70 Views
Martin Hope
Zombo
Asked: 2018-02-06 17:36:19 +0800 CST

转义变量中的双引号

  • 5

我想将此命令放入一个文件中以便稍后运行:

ln -s "$xr"/ya.txt ~

我可以用(1)做到这一点:

cat > zu.sh <<eof
ln -s "$xr"/ya.txt ~
eof

或 (2):

printf 'ln -s "%s"/ya.txt ~\n' "$xr" > zu.sh

或 (3):

echo "ln -s '$xr'/ya.txt ~" > zu.sh

或 (4):

printf 'ln -s %q/ya.txt ~\n' "$xr" > zu.sh

或 (5):

printf 'ln -s "%s"/ya.txt ~\n' "${xr//\"/\\\"}"

然而,每个解决方案都是有问题的。如果 (1) 或 (2) 中的变量包含双引号,它们将失败;如果 (3) 中的变量包含单引号,它将失败。(4) 很好,但不是由 POSIX 定义的。(5) 是好的,但是是 Bashism。看起来最好的选择是使用 (1) 或 (2) 并转义变量中的任何双引号,但这可以通过其他方式完成吗?

shell quoting
  • 1 个回答
  • 7920 Views
Martin Hope
Zombo
Asked: 2018-02-05 15:06:42 +0800 CST

一元加回归

  • 7

以前,可以通过添加零 (+0)、一元加号 (+) 或一元减号 (-) 来触发数字转换:

$ gawk --version
GNU Awk 4.1.4, API: 1.1 (GNU MPFR 3.1.6-p1, GNU MP 6.1.2)

$ gawk 'BEGIN {print "01" + 0}'
1

$ gawk 'BEGIN {print +"01"}'
1

$ gawk 'BEGIN {print -"01"}'
-1

但是,现在转换只发生在加零和一元减号时:

$ gawk --version
GNU Awk 4.2.0, API: 2.0 (GNU MPFR 3.1.6-p1, GNU MP 6.1.2)

$ gawk 'BEGIN {print "01" + 0}'
1

$ gawk 'BEGIN {print +"01"}'
01

$ gawk 'BEGIN {print -"01"}'
-1

有谁知道在哪里提到了这个变化或者为什么要这样做?

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html

awk string
  • 1 个回答
  • 195 Views
Martin Hope
Zombo
Asked: 2018-02-04 11:04:19 +0800 CST

HISTTIMEFORMAT 并删除匹配的历史条目

  • 0

我想删除与某个字符串匹配的所有历史记录条目。我找到 了这个方法:

grep -v searchstring "$HISTFILE" > /tmp/history
mv /tmp/history "$HISTFILE"

但它不考虑 HISTTIMEFORMAT 注释,例如:

#1517681911
echo 1
#1517681918
echo 2
#1517681931
echo 3

如果我想删除“echo 2”,前面的评论也需要删除。我怎样才能做到这一点?

bash shell
  • 1 个回答
  • 440 Views
Martin Hope
Zombo
Asked: 2018-01-21 05:46:37 +0800 CST

定制终端少

  • 2

目前我在我的“~/.profile”中有这个:

export PAGER='env TERM=fox less'

但是我刚刚意识到这仅适用于“人”,而不是如果您执行以下操作:

less /etc/DIR_COLORS

为了解决这个问题,我创建了一个“~/.lesskey”文件:

#env
LESS = -i
TERM = fox

并通过运行“lesskey”安装。现在,当我运行“less”时,可以识别“LESS”变量,但不能识别“TERM”变量。如何减少使用自定义终端?

environment-variables terminal
  • 1 个回答
  • 103 Views
Martin Hope
Zombo
Asked: 2018-01-15 12:05:42 +0800 CST

使用空字符串拆分单个字符

  • 3

我在 Gawk 手册中读到了这个:

GNU 扩展

[...]

使用空字符串作为 FS 的值并作为 split() 的第三个参数来拆分单个字符的能力。

然而,情况似乎并非如此。这按预期工作:

$ gawk 'BEGIN {print split("quebec", z, "")}'
6

我可以禁用其他扩展:

$ export POSIXLY_CORRECT
$ gawk 'BEGIN {typeof(1)}'
gawk: cmd. line:1: fatal: function `typeof' not defined

但我不能禁用拆分行为:

$ export POSIXLY_CORRECT
$ gawk 'BEGIN {print split("quebec", z, "")}'
6

$ gawk --posix 'BEGIN {print split("quebec", z, "")}'
6

我还看了 Mawk 手册:

如果 FS = "",则 mawk 将记录拆分为单个字符,并且类似地,split(s,A,"") 将 s 的单个字符放入 A。

[...]

Posix 明确地未定义 FS = "" 的行为,并提到将记录拆分为字符作为一种可能的解释,但目前这种用法不能跨实现移植。

那么,用什么实现你不能用FSand 得到单个字符split?

awk posix
  • 1 个回答
  • 1134 Views
Martin Hope
Zombo
Asked: 2017-12-24 10:50:29 +0800 CST

带有搜索结果的时间戳

  • 0

我知道我可以用 搜索历史CtrlR。我也可以看到这样的时间戳:

HISTTIMEFORMAT='%x %r '

然后运行“历史”命令。但是我想将两者结合起来。我想使用其中一种或类似方法进行搜索:

  • CtrlR
  • history
  • fc
  • grep
  • less

但结果应该有时间戳。这样的事情可能吗?

bash shell
  • 1 个回答
  • 71 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve