标签: awk

在正则表达式中打印反向引用

我希望有一种方法让 sed 用替换(而不仅仅是匹配)替换整行,这样我就可以做这样的事情:

sed -e "/$some_complex_regex_with_a_backref/\1/"
Run Code Online (Sandbox Code Playgroud)

并让它只打印反向引用。

这个问题来看,似乎这样做的方法是使用正则表达式来匹配整行,或者使用其他工具(如 perl)。简单地更改regexto.*regex.*并不总是有效(如该问题中所述)。例如:

$ echo $regex
\([:alpha:]*\)day

$ echo $phrase
it is Saturday tomorrow

$ echo $phrase | sed "s/$regex/\1/"
it is Satur tomorrow

$ echo $phrase | sed "s/.*$regex.*/\1/"

$ # what I'd like to have happen
$ echo $phrase | [[[some command or string of commands]]]
Satur
Run Code Online (Sandbox Code Playgroud)

假设以下情况,我正在寻找最简洁的方法来做到这一点:

  • 正则表达式在一个变量中,因此不能根据具体情况进行更改。
  • 我想在不使用 perl 或其他更强大的语言的情况下做到这一点。

shell grep awk sed

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

awk - awk 连接字符串变量

我想在 awk 中连接字符串变量。我怎样才能做到这一点?我试过:

BEGIN{
t="."
r=";"
w=t+r
print w}
Run Code Online (Sandbox Code Playgroud)

但我不工作。输出:

0
Run Code Online (Sandbox Code Playgroud)

或者我想添加变量和函数结果。输入:

t t t t
a t a ta
ata ta a a
Run Code Online (Sandbox Code Playgroud)

脚本:

{
key="t"
print gsub(key,"")#<-it's work
b=b+gsub(key,"")#<- it's something wrong
}
END{
print b}#<-so this is 0
Run Code Online (Sandbox Code Playgroud)

输出:

4
2
2
0#<-the last print
Run Code Online (Sandbox Code Playgroud)

awk string

6
推荐指数
1
解决办法
3万
查看次数

如何根据模式拆分二进制文件?

我想根据模式“xÚ”(十六进制为 78 DA)将二进制文件拆分为较小的文件,因此当文件中有“xÚ”时,拆分器脚本会将内容拆分并粘贴到新文件中,直到另一个 '可以找到 xÚ'。新创建的文件应以“xÚ”开头。

FreeBSD awk, grep,sh首选。

unix awk

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

是否可以更改 awk 中的默认字段分隔符?

我总是使用 awk 来操作逗号分隔的文件,因此我的代码中的第一行总是将字段分隔符更改为“,”,如下所示:

awk 'BEGIN {FS=","}
$2 < 20 {print $1}' myfile.csv
Run Code Online (Sandbox Code Playgroud)

是否可以更改 awk 的默认设置,使逗号成为默认FS?这不是一个大问题,但它只会让事情变得更整洁一些。我尝试谷歌搜索,但没有找到任何有用的东西;这可能是不可能的,但我想我会问!

awk

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

如何限制与选项 -print0 一起使用的 find 命令的输出

我想限制 find 命令的输出。过去我曾经用于这个 ls 命令,例如:

ls *tgz|head -100|xargs -i mv "{}" ../
Run Code Online (Sandbox Code Playgroud)

但我知道如果文件名包含换行符,结果可能是不可预测的。所以更正确的方法是这样的:

find ... -print0 | xargs -0
Run Code Online (Sandbox Code Playgroud)

但是采用这种方法我无法使用 head 命令限制 find 的输出 - 它显示所有文件名用 ^@ 特殊符号分隔:

 find . -name '*tgz' -print0|head -2|less
Run Code Online (Sandbox Code Playgroud)

file1.tgz^@file2.tgz^@file3.tgz^@file4.tgz^@file5.tgz^@

有没有办法消除这种尴尬?

我试图在 awk 的帮助下解决它:

find . -name 'BATCHED*' -print0|awk 'BEGIN{RS=""}'
Run Code Online (Sandbox Code Playgroud)

但它仍然显示所有或零行。

可以借助awk解决吗?有更好的解决方案吗?

顺便提一句。我发现这个非常有指导意义的参考,但我的问题没有答案。

bash awk find

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

搜索包含多个术语的文件(grep、awk?)

我正在使用这样的命令来查找其中包含“term”一词的文件:

grep -l term *
Run Code Online (Sandbox Code Playgroud)

但我现在希望能够找到其中包含两个不同单词的文件(我们称它们为 termA 和 termB)——不一定在同一行。我想找到包含两个术语的文件,而不仅仅是具有任一术语的文件。

现在我可以为此编写一个繁琐的 bash 脚本,但是 grep、egrep、awk、sed 或其他任何东西都有可以帮助我的工具吗?

提前致谢。

linux grep awk sed

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

使用 grep 从文件中删除包含来自另一个文件的字符串的行

我有一个包含单词(每行一个)的文件,例如





我有一个 CSV 格式的辅助文件,例如

1,鞋子,红色
2,苹果,黑色
3,雾,蓝色

我想使用 grep 将第一个文件作为搜索模式,如果辅助文件中的一行在第一个文件中包含一个单词,我想完全删除辅助文件中的该行。

我不确定 grep 甚至是解决这个问题的方法。

编辑:bash 脚本

bash grep awk sed command-line

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

将 awk 与 find -exec 一起使用

我有一个包含 14 个目录的目录结构,其中包含一堆包含三列格式数据的文件(用制表符分隔)。我打算使用 find 和 awk 从每个文件中提取第二列,并使用相同的文件名但在不同的根文件夹下输出它。这是我的目录的草图。

data/all -> AA, AB, AC, AD ...(A* 是包含以 3 列格式存储数据的文件的文件夹,例如 AA100.txt、AA101.txt ...)

我希望修改后的(一列)文件具有相同的名称,但都在一个新的根目录下 data/pos(而不是 data/all/)-> AA、AB、AC、AD ...(再次, 每个包含 A*100.txt, A*101...)

我的尝试是使用 find -exec 并为其提供 awk 命令,但是我在将文件输出到正确的位置时遇到了问题。

当在数据/全部/

find * -type f -exec awk '{print$2}' '{}' > ../pos/'{}' \;

但是 {} 作为输入文件的通配符在输出文件时似乎不起作用?

我究竟做错了什么?(顺便说一句,我在 ubuntu 服务器上)

unix awk find

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

如何用换行符替换换行符?

使用sed到包含某些字符适用于字符串常量使用使文字很简单:

sed "s/\\\\/\\\\\\\\/g"
sed "s/\\\"/\\\\\\\"/g"
Run Code Online (Sandbox Code Playgroud)

但是如何对包含换行符的文本文件做类似的事情呢?

awk sed

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

如何链接 awk 打印语句?

好的,这是一个简单的例子;我分三步隔离主机的 IPV4:

ip -br a  
lo               UNKNOWN        127.0.0.1/8 ::1/128 
eth0             DOWN           
wlan0            UP             192.168.0.101/24 fe80::9fcd:45fb:1e0f:a1cc/64 
Run Code Online (Sandbox Code Playgroud)
ip -br a | awk '/wlan0/ {print $3}'  
192.168.0.101/24
Run Code Online (Sandbox Code Playgroud)
ip -br a | awk '/wlan0/ {print $3}' | awk -F '/' '{print $1}'
192.168.0.101
Run Code Online (Sandbox Code Playgroud)

而不是调用awk(将一个的输出传送到下一个)的第二个实例;怎么能一蹴而就?


只想说:问题不在于解析ip. 我只需要一个简单的例子来帮助说明这个问题;这是我想到的第一件事。真正的问题总结在标题中。

无论如何,它的价值(我必须检查它,但我很确定);这就是我在(最近)过去所做的:

ip -br a s dev wlan0 | awk -F '[ /]*' '{print $3}'
192.168.0.101
Run Code Online (Sandbox Code Playgroud)

bsd bash gnu awk text-manipulation

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

标签 统计

awk ×10

sed ×4

bash ×3

grep ×3

find ×2

unix ×2

bsd ×1

command-line ×1

gnu ×1

linux ×1

shell ×1

string ×1

text-manipulation ×1