我想限制 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解决吗?有更好的解决方案吗?
顺便提一句。我发现这个非常有指导意义的参考,但我的问题没有答案。
我有一个包含 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 服务器上)
我想将以下命令行序列保存为 bash 别名:
grep `date '+%d/%b/%Y'` access.logs | egrep 2765330645ae47d292c9ceac725d744e.py |awk '{print $1, $4, $5, $7, $8, $9, $10}' | sort |uniq -c -w15 |sort -n
Run Code Online (Sandbox Code Playgroud)
它在命令行中运行良好,但当我尝试将其设置为别名时失败。我尝试将以下内容添加到 .bash_profile:
alias downloads="grep `date '+%d/%b/%Y'` access.logs | egrep 2765330645ae47d292c9ceac725d744e.py |awk '{print $1, $4, $5, $7, $8, $9, $10}' | sort |uniq -c -w15 |sort -n"
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
-bash-3.2$ downloads
awk: {print , , , , , , 0}
awk: ^ syntax error
awk: {print , , , , , , 0}
awk: ^ syntax …Run Code Online (Sandbox Code Playgroud) 我有一个这样的文件:
123123213,456,be
124243233,4346,ytr
123123123,436535,uytr
324234324,322,yt
234324323,32,tyutr
Run Code Online (Sandbox Code Playgroud)
我想对中间字段进行零填充以给出结果:
123123213,00000456,be
124243233,00004346,ytr
123123123,00436535,uytr
324234324,00000322,yt
234324323,00000032,tyutr
Run Code Online (Sandbox Code Playgroud)
我如何制作一个可以做到这一点的脚本?
我见过这样的例子
awk '{ $6=sprintf("%06s", $6); print $0}'
Run Code Online (Sandbox Code Playgroud)
但我并不真正理解它,因此无法让它工作。
我想在文件中间插入一些文本。要插入的文本将在特定行之后,例如“ <begin>”。我不知道行号,也不知道要插入的文本行数。我只知道在读取“ <begin>”的行之后,我需要插入另一个文件的内容。
我只是不知道如何使用 awk 来做这样的事情。
谢谢 :-)
我有一个包含 IP 地址列表和其他信息的文本文件。
我正在使用 awk 脚本来处理此列表并输出各种计算。我想dig -x从 awk 脚本内部调用并使用返回的值。
我试过了
hostname = system("dig +short -x" ip_address);
Run Code Online (Sandbox Code Playgroud)
但发生的事情是——
调用 dig 将一行打印到 shell
主机名保持为空
我有一个文本文件,其中包含由单词组成的行(用空格分隔),我想在所有单词周围加上引号。
例如:
Lorem ipsum dolor sit amet
consectetur
adipisicing elitsed do
eiusmod tempor
incididunt ut
labore et dolore magna
aliqua
Run Code Online (Sandbox Code Playgroud)
应该变成:
"Lorem" "ipsum" "dolor" "sit" "amet"
"consectetur"
"adipisicing" "elitsed" "do"
"eiusmod" "tempor"
"incididunt" "ut"
"labore" "et" "dolore" "magna"
"aliqua"
Run Code Online (Sandbox Code Playgroud) 假设我有一些输出一堆字符串的命令。此命令的输出可能类似于:
...
foo
bar
blargh
...
Run Code Online (Sandbox Code Playgroud)
说我有一些固定的字符串
myString$Blah
Run Code Online (Sandbox Code Playgroud)
我想在命令的输出中插入 $ 所在的每个字符串,这样我最终会得到一个如下所示的文件:
...
myStringfooBlah
myStringbarBlah
myStringblarghBlah
...
Run Code Online (Sandbox Code Playgroud)
实现这一目标的最简单方法是什么?(awk 和 sed 首选)
我有一个总是 3 个字符的字符串......第一个和最后一个总是相同的。
例子:
???
有没有一种简单的方法只显示中间的那个?(这是唯一改变的)
假设我知道someFile.php包含someFunction(). 我将如何在标准输出中显示整个函数体?如果我知道主体有 10 行长,那么我会使用cat someFile.php | grep -A 10 "function someFunction"[1] 但实际上该函数可以是任意长度。
我想sed我可以使用 Vimesque 命令,例如/function someFunction<Return>/{<Return>%[2],但我不知道如何格式化它。理想情况下,函数之前的 PHPDoc 将与函数一起输出。
任何帮助或指向适当的精美手册的链接将不胜感激。谢谢!
[1] 我知道这cat是多余的,但我发现这种格式更容易阅读。
[2] 找到函数定义,到左大括号,到右大括号