sed,awk:在之前查找模式和20个字符

sed,awk:在之前查找模式和20个字符,awk,sed,grep,find,Awk,Sed,Grep,Find,我有任何具有此模式的过长文件: "196","02041873983107165016.jpg","0","0","0","0009.jpg","1" "197","22326275984445946358.jpg","0","0","0","0011.jpg","1" "198","94656137600921259484.jpg","0","0","0","0012.jpg","1" "199","14489943688842089858.jpg","0","0","0","0013.jpg

我有任何具有此模式的过长文件:

"196","02041873983107165016.jpg","0","0","0","0009.jpg","1"
"197","22326275984445946358.jpg","0","0","0","0011.jpg","1"
"198","94656137600921259484.jpg","0","0","0","0012.jpg","1"
"199","14489943688842089858.jpg","0","0","0","0013.jpg","1"
"200","04120962316412927503.jpg","0","0","0","0008.jpg","1"
"201","24360101806918799057.jpg","0","0","0","0009.jpg","1"
"202","48341366030411757581.jpg","0","0","0","0012.jpg","1"
"203","55697947255646026367.jpg","0","0","0","0013.jpg","1"
"204","73425273021963647924.jpg","0","0","0","2s0l92c.jpg","
.................
我想在此处获取文件名:.jpg和20个字符,然后:

73425273021963647924.jpg
55697947255646026367.jpg
............
如何使用grep、sed或awk实现这一点

谢谢

试试这句grep:

grep -Eo '[^",]{20}[.]jpg' file
以您的示例为例,它输出:

kent$  grep -Eo '[^",]{20}[.]jpg' f  
02041873983107165016.jpg
22326275984445946358.jpg
94656137600921259484.jpg
14489943688842089858.jpg
04120962316412927503.jpg
24360101806918799057.jpg
48341366030411757581.jpg
55697947255646026367.jpg
73425273021963647924.jpg
试试这个grep行:

grep -Eo '[^",]{20}[.]jpg' file
以您的示例为例,它输出:

kent$  grep -Eo '[^",]{20}[.]jpg' f  
02041873983107165016.jpg
22326275984445946358.jpg
94656137600921259484.jpg
14489943688842089858.jpg
04120962316412927503.jpg
24360101806918799057.jpg
48341366030411757581.jpg
55697947255646026367.jpg
73425273021963647924.jpg
使用awk:

awk -F\" '{ print $4 }' file
输出:

02041873983107165016.jpg
22326275984445946358.jpg
94656137600921259484.jpg
14489943688842089858.jpg
04120962316412927503.jpg
24360101806918799057.jpg
48341366030411757581.jpg
55697947255646026367.jpg
73425273021963647924.jpg
使用awk:

awk -F\" '{ print $4 }' file
输出:

02041873983107165016.jpg
22326275984445946358.jpg
94656137600921259484.jpg
14489943688842089858.jpg
04120962316412927503.jpg
24360101806918799057.jpg
48341366030411757581.jpg
55697947255646026367.jpg
73425273021963647924.jpg

使用awk在
.jpg
之前提取20个字符,并包括
.jpg

awk '$0=substr($0,index($0,".jpg")-20,24)' file

02041873983107165016.jpg
22326275984445946358.jpg
94656137600921259484.jpg
14489943688842089858.jpg
04120962316412927503.jpg
24360101806918799057.jpg
48341366030411757581.jpg
55697947255646026367.jpg
73425273021963647924.jpg

使用awk在
.jpg
之前提取20个字符,并包括
.jpg

awk '$0=substr($0,index($0,".jpg")-20,24)' file

02041873983107165016.jpg
22326275984445946358.jpg
94656137600921259484.jpg
14489943688842089858.jpg
04120962316412927503.jpg
24360101806918799057.jpg
48341366030411757581.jpg
55697947255646026367.jpg
73425273021963647924.jpg

为了真正通用并提取每行上第一次出现的“.jpg”以及在此之前出现的(最多)20个字符,我建议使用以下两步sed解决方案:

$ sed -r 's/(.{,20}\.jpg).*/\1/;s/.*(.{24})/\1/' file
02041873983107165016.jpg
22326275984445946358.jpg
94656137600921259484.jpg
14489943688842089858.jpg
04120962316412927503.jpg
24360101806918799057.jpg
48341366030411757581.jpg
55697947255646026367.jpg
73425273021963647924.jpg
25273021963647924.jpg
这是对已编辑的OP问题的回答,在“.jpg”第一次出现之前,最后一行仅包含17个字符。我们必须使用sed分两步进行,因为与使用grep一样,我们不能在模式保存到括号中之前包含
*
,否则它将匹配行中第二次出现的“.jpg”

否则,如果输入真的像OP所给出的那样简单,并且没有什么不好的惊喜,那么我们甚至可以使用带有剪切的固定宽度字符串提取:

$ cut -c 8-31 file
提供相同的期望输出:

02041873983107165016.jpg
22326275984445946358.jpg
94656137600921259484.jpg
14489943688842089858.jpg
04120962316412927503.jpg
24360101806918799057.jpg
48341366030411757581.jpg
55697947255646026367.jpg
73425273021963647924.jpg

为了真正通用并提取每行上第一次出现的“.jpg”以及在此之前出现的(最多)20个字符,我建议使用以下两步sed解决方案:

$ sed -r 's/(.{,20}\.jpg).*/\1/;s/.*(.{24})/\1/' file
02041873983107165016.jpg
22326275984445946358.jpg
94656137600921259484.jpg
14489943688842089858.jpg
04120962316412927503.jpg
24360101806918799057.jpg
48341366030411757581.jpg
55697947255646026367.jpg
73425273021963647924.jpg
25273021963647924.jpg
这是对已编辑的OP问题的回答,在“.jpg”第一次出现之前,最后一行仅包含17个字符。我们必须使用sed分两步进行,因为与使用grep一样,我们不能在模式保存到括号中之前包含
*
,否则它将匹配行中第二次出现的“.jpg”

否则,如果输入真的像OP所给出的那样简单,并且没有什么不好的惊喜,那么我们甚至可以使用带有剪切的固定宽度字符串提取:

$ cut -c 8-31 file
提供相同的期望输出:

02041873983107165016.jpg
22326275984445946358.jpg
94656137600921259484.jpg
14489943688842089858.jpg
04120962316412927503.jpg
24360101806918799057.jpg
48341366030411757581.jpg
55697947255646026367.jpg
73425273021963647924.jpg

考虑到这些输入,您只需要:

cut -d\" -f4

考虑到这些输入,您只需要:

cut -d\" -f4

假设您有OPs问题,但没有示例输入,这只适用于此特定示例,并且没有考虑之前的字符数。@Jidder OP可能没有找到更简单的方法来完成此操作。我还设想了你的解决方案(使用
substr
),但我选择不让它复杂化。@Jidder我在这一点上与konsolebox合作,我认为这是一个典型的案例,OP告诉我们他们想要什么解决方案,因为他们只知道这些,而不告诉我们他们的需求是什么。这里的大部分或所有的解决方案都依赖于输入,如图所示(例如,考虑你的用一个不包含<代码> JPG< /代码>的行来做什么),就像这个答案一样。“我知道,OP可能不知道这是一个选项,但是问题的标题是在一个模式之前找到20个字符。这个答案不包括一个模式,也不包括一种找到以前角色的方法。如果我一直在寻找这个问题,而这是唯一的答案,我会非常失望,也不会有什么帮助。我想这个问题可以改变。另外,.jpg只是一个要搜索的模式的示例。假设您有OPs问题,但没有示例输入,这只适用于这个特定的示例,并且没有考虑以前的字符数。@Jidder OP可能没有找到一种更简单的方法。我还设想了你的解决方案(使用
substr
),但我选择不让它复杂化。@Jidder我在这一点上与konsolebox合作,我认为这是一个典型的案例,OP告诉我们他们想要什么解决方案,因为他们只知道这些,而不告诉我们他们的需求是什么。这里的大部分或所有的解决方案都依赖于输入,如图所示(例如,考虑你的用一个不包含<代码> JPG< /代码>的行来做什么),就像这个答案一样。“我知道,OP可能不知道这是一个选项,但是问题的标题是在一个模式之前找到20个字符。这个答案不包括一个模式,也不包括一种找到以前角色的方法。如果我一直在寻找这个问题,而这是唯一的答案,我会非常失望,也不会有什么帮助。我想这个问题可以改变。而且.jpg只是一个要搜索的模式的例子。我支持Jidder对konsolebox给出的答案的评论:您建议的答案不严格符合OP的要求:“行中出现的“.jpg”(第一次)和前面的20个字符(或者直到行的开头),不管这些字符是什么。我确信您注意到了更简单、更直接的
grep-Eo.{20}\.jpg'essai
的奇怪行为,它在输入的最后一行出错,但我们必须面对这一点,而不是提供
[^,]
解决方案,呵呵…;)我支持Jidder对konsolebox给出的答案的评论:您所建议的答案不严格符合OP的要求,即“.jpg(第一次)出现在行上以及前20个字符(或直到行的开头),不管这些字符是什么。我确信您注意到了更简单、更直接的
grep-Eo.{20}\.jpg'essai
的奇怪行为,它在输入的最后一行出错,但我们必须面对这一点,而不是提供
[^,]
解决方案,呵呵……;)