我试图从unix数据文件中获取前22个字符.这是我的数据如下所示.
前12个字符是第1列,接下来的10个字符是第2列.
000000000001199998000180000 DUMMY RAG # MFR NOT ST 1999980 ZZ- 0 0 0ZZ-
000000000002199998000180000 DUMMY RAG # MFR NOT ST 1999980 ZZ- 0 0 0ZZ-
000000000003199998000180000 DUMMY RAG # MFR NOT ST 1999980 ZZ- 0 0 0ZZ-
000000000004199998000180000 DUMMY RAG # MFR NOT ST 1999980 ZZ- 0 0 0ZZ-
000000000005199998000180000 DUMMY RAG # MFR NOT ST 1999980 ZZ- 0 0 0ZZ-
000000000006199998000180000 DUMMY RAG # MFR NOT ST 1999980 ZZ- 0 0 0ZZ-
Run Code Online (Sandbox Code Playgroud) 我有一个包含以下内容的XML文件:
<?xml version="1.0" encoding="utf-8"?>
<job xmlns="http://www.sample.com/">programming</job>
Run Code Online (Sandbox Code Playgroud)
我需要一种方法来提取<job..> </job>标签中的内容,在这种情况下是programmin.这应该在linux命令提示符下完成,使用grep/sed/awk.
任何想法如何实现相同?
awk '
{
{
split($i, keyVal, "@")
key=keyVal[1];
val=keyVal[2];
if(val ~ /^ *$/)
val="Y";
}
}
' File
Run Code Online (Sandbox Code Playgroud)
我试过了
1) if(val == "")
2) if(val ~ /^ *$/)
Run Code Online (Sandbox Code Playgroud)
两种情况都不起作用.
我有类似下面的文件,我想打印给定的两个模式之间的界限PAT1和PAT2.
1
2
PAT1
3 - first block
4
PAT2
5
6
PAT1
7 - second block
PAT2
8
9
PAT1
10 - third block
Run Code Online (Sandbox Code Playgroud)
我已经阅读了如何选择两个标记图案之间的线条,这些线条可能会出现awk/sed多次,但我很想看到所有可能的组合,无论是否打印图案.
如何选择两种模式之间的线?
我需要删除文本文件中的奇数行以进行下采样.我找到了这个命令,
awk 'NR%2==0' file
Run Code Online (Sandbox Code Playgroud)
但它只打印终端中的奇数行.如何真正删除它们?
我真的不关心偶数或奇数,我希望它们从文件中删除或打印在另一个文件中.这只会在终端上打印出来.
好吧,所以我知道使用$打印一行的特定参数非常简单:
$ cat file
hello world
$ awk '{print $1}' file
hello
Run Code Online (Sandbox Code Playgroud)
但是如果我想打印2到8的字符怎么办?还是3到7?用awk可以吗?
直截了当,我想知道如何使用grep/find/sed/awk来匹配某个字符串(以数字结尾)并将该数字增加1.我最接近的是将1连接到结束(效果很好)因为主要是简单地改变价值.这是我目前正在做的事情:
find . -type f | xargs sed -i 's/\(\?cache_version\=[0-9]\+\)/\11/g'
Run Code Online (Sandbox Code Playgroud)
由于我无法弄清楚如何增加数字,我抓住了整个事情,只是附加了一个"1".以前,我有这样的事情:
find . -type f | xargs sed -i 's/\?cache_version\=\([0-9]\+\)/?cache_version=\11/g'
Run Code Online (Sandbox Code Playgroud)
所以至少我理解如何捕捉我需要的东西.
我不会解释这是什么,而只是解释我想要它做什么.它应该基于当前目录递归地在任何文件中找到文本(不重要,它可以是任何目录,所以我稍后再配置),将"?cache_version ="与数字匹配.然后它将增加该数字并将其替换为文件.
目前我上面的东西工作,只是我不能在最后增加找到的数字.能够增加而不是附加"1"以便将来的值不是"11","111","1111","11111"等等会更好.
我已经经历了数十篇文章/解释,而且经常就是建议是使用awk,但我不能为我的生活混合它们.我最接近使用的awk,实际上并没有取代任何东西,是:
grep -Pro '(?<=\?cache_version=)[0-9]+' . | awk -F: '{ print "match is", $2+1 }'
Run Code Online (Sandbox Code Playgroud)
我想知道是否有一些方法可以sed在最后输出一个并传递原始文件名,以便sed可以拥有文件名和增加的数字(来自awk),或者它需要的任何东西xargs.
从技术上讲,这个数字并不重要; 这个替换主要是为了确保那里有一个新的数字,100%肯定不同于最后一个.因此,当我写这个问题时,我意识到我也可以使用系统时间 - 自纪元以来的秒数(AJAX经常使用的技术来消除后续"相同"请求的缓存).我最终得到了这个,看起来很完美:
CXREPLACETIME=`date +%s`; find . -type f | xargs sed -i "s/\(\?cache_version\=\)[0-9]\+/\1$CXREPLACETIME/g"
Run Code Online (Sandbox Code Playgroud)
(我首先存储该值,以便所有文件获得相同的值,以防它因任何原因跨越多秒)
但我仍然希望知道原始问题,增加一个匹配的数字.我猜一个简单的解决办法就是让它成为一个bash脚本,但是,我认为有一种比递归循环遍历每个文件并检查其内容然后替换更简单的方法,因为它只是递增一个匹配的数字......没有其他逻辑.我只是不想写任何其他文件或类似的东西 - 它应该在适当的位置,就像sed"i"选项一样.
我有
1 LINUX param1 value1
2 LINUXparam2 value2
3 SOLARIS param3 value3
4 SOLARIS param4 value4
Run Code Online (Sandbox Code Playgroud)
我需要在awk打印所有行中$2是LINUX.
我有一个文件,其中包含编码的用户代理列表.例如:
Mozilla%2F5.0%20%28Macintosh%3B%20U%3B%20Intel%20Mac%20OS%20X%2010.6%3B%20en
Run Code Online (Sandbox Code Playgroud)
我想要一个shell脚本,它可以读取该文件并写入带有解码字符串的新文件.
Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en
Run Code Online (Sandbox Code Playgroud)
我一直在尝试使用这个例子来实现它,但到目前为止还没有工作.
$ echo -e "$(echo "%31+%32%0A%33+%34" | sed 'y/+/ /; s/%/\\x/g')"
Run Code Online (Sandbox Code Playgroud)
我的脚本看起来像:
#!/bin/bash
for f in *.log; do
echo -e "$(cat $f | sed 'y/+/ /; s/%/\x/g')" > y.log
done
Run Code Online (Sandbox Code Playgroud) 我想从文件中删除所有空行,但只有当它们位于文件的结尾/开始时(即,如果它们之前没有非空行,则在开始时;如果有最后没有非空行.)
这是否可能在Perl或Ruby等功能齐全的脚本语言之外?我宁愿用做这个sed或者awk如果可能的话.基本上,任何轻量级和广泛使用的UNIX-y工具都可以,特别是我可以快速了解更多(Perl,因此,不包括在内).