小编hol*_*asz的帖子

使用 grep 与 awk

要捕获特定模式,awk并且grep可以使用。为什么我们应该使用一个?哪个更快,为什么?

如果我有一个日志文件并且我想获取某个模式,我可以执行以下操作之一

awk '/pattern/' /var/log/messages
Run Code Online (Sandbox Code Playgroud)

或者

grep 'pattern' /var/log/messages
Run Code Online (Sandbox Code Playgroud)

我没有做过任何基准测试,所以我不知道。有人可以详细说明吗?很高兴了解这两个工具的内部工作原理。

linux performance grep awk

23
推荐指数
4
解决办法
1万
查看次数

"echo >/sys/..." 在使用 >/dev/null 2>&1 时不生效

这有点奇怪。我正在尝试使用以下命令扫描 iSCSI 设备:

echo 1 > /sys/block/sda/device/rescan >/dev/null 2>&1
# Doesn't work. The rescan won't recognize the new available disk space. 

echo 1 > /sys/block/sda/device/rescan
# Works: recognizes the new available disk space. 
Run Code Online (Sandbox Code Playgroud)

我如何将所有标准输出和标准错误发送到/dev/null,因为我不希望我的屏幕变得凌乱?

bash io-redirection

5
推荐指数
1
解决办法
1680
查看次数

在 awk 上使用 system() 函数在第一列上运行命令

我有以下代码,我正在运行它来提取一些 IP 地址并计算它们的唯一性。例如

./my_program | awk '/^10./{a[$1 FS $2]++ } END { for(i in a) print i,a[i]}' > some_file
Run Code Online (Sandbox Code Playgroud)

some_file包含的输出是这样的:

10.12.33.14 34
10.12.33.11 12
10.12.33.16 5
Run Code Online (Sandbox Code Playgroud)

现在我想要的是运行{system("dig +short -x " i)}并将输出追加到最后一列,以便文件看起来像

10.12.33.14 34  server1.rdns.domain.tld
10.12.33.11 12  server2.rdns.domain.tld
10.12.33.16 5   server3.rdns.domain.tld
Run Code Online (Sandbox Code Playgroud)

我可以一次性完成此操作,然后将输出通过管道传输到文本文件吗?

谢谢!

更新1

... END { for(i in a) cmd=sprintf("dig +short -x \"%s\"", $i); cmd | getline type; close(cmd);  printf("%s %s %s\n",i,a[i],type);
Run Code Online (Sandbox Code Playgroud)

这就是输出(stderr)的结尾

dig: '.in-addr.arpa.' is not a legal name (unexpected end of input)
Run Code Online (Sandbox Code Playgroud)

这是我在文件中看到的

10.12.33.14 34 …
Run Code Online (Sandbox Code Playgroud)

linux awk shell-script gawk

5
推荐指数
2
解决办法
749
查看次数

bash 中的移位问题

试图在 find 周围使用包装器,但遇到以下问题。例如,我想提供一些目录作为参数,但最后一个参数始终是一个数字,指示应删除多旧数据。例如:

rmoldfiles dir1 dir2 dir3 20
Run Code Online (Sandbox Code Playgroud)

这应该删除超过 30 天的旧文件 looking at mtime of course

这是脚本:

#!/bin/bash

die()
{
  echo >&2 "$@"
  exit 1
}

usage()
{
  echo >&2 "Usage: $0 [dir1 dir2 dir3] [days old]"
  die
}

if [[ (($# < 1)) || -f "$1" ]]; then
  if [[ -f "$1" ]]; then 
    printf '%s\n' "Please provide a directory"
  fi
  usage
fi 

while (( $# )); do 
  while IFS= read -r -d $'\0' file; do
    printf 'rm %s\n' …
Run Code Online (Sandbox Code Playgroud)

shell bash

2
推荐指数
1
解决办法
1535
查看次数

使用第一列作为 csv 的标题

我有一个输入文件如下

hello: hello12
foo: bar14
test3: pppp
more: stuff
test14: bla
Run Code Online (Sandbox Code Playgroud)

有没有办法使用第一列作为标题并用逗号分隔它,如下所示:

hello,foo,test3,more,test14
hello12,bar14,pppp,stuff,bla
Run Code Online (Sandbox Code Playgroud)

我尝试了一些方法但没有成功。

awk text-processing cut csv

1
推荐指数
1
解决办法
675
查看次数