linux Awk模式匹配

lnvxswe2  于 2024-01-06  发布在  Linux
关注(0)|答案(8)|浏览(230)

我想打印

  1. userId = 1234
  2. userid = 12345
  3. timestamp = 88888888
  4. js = abc

字符串
从我的数据

  1. messssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
  2. <input name="userId" value="1234" type="hidden"> messsssssssssssssssssss
  3. <input name="userid" value="12345" type="hidden"> messssssssssssssssssss
  4. <input name="timestamp" value="88888888" type="hidden"> messssssssssssss
  5. <input name="js" value="abc" type="hidden"> messssssssssssssssssssssssss
  6. messssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss


如何使用AWK(或其他)实现这一点呢?假设我的数据存储在“$info“变量中(单行数据)。
编辑:单线数据我的意思是所有的数据都是这样表示的

  1. messss...<input name="userId" value="1234" type="hidden">messsss...<input ....>messssssss


所以我不能使用grep来提取兴趣区。

nnsrf1az

nnsrf1az1#

我不确定我是否理解了你的“单行数据”评论,但如果这是在一个文件中,你可以这样做:

  1. cat file
  2. | grep '^<input '
  3. | sed 's/^<input name="//'
  4. | sed 's/" value="/ = /'
  5. | sed 's/".*$//'

字符串
以下是Cut'n'Paste版本:

  1. cat file | grep '^<input ' | sed 's/^<input name="//' | sed 's/" value="/ = /' | sed 's/".*$//'


这将变成:

  1. messssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
  2. <input name="userId" value="1234" type="hidden"> messsssssssssssssssssss
  3. <input name="userid" value="12345" type="hidden"> messssssssssssssssssss
  4. <input name="timestamp" value="88888888" type="hidden"> messssssssssssss
  5. <input name="js" value="abc" type="hidden"> messssssssssssssssssssssssss
  6. messssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss


很高兴地进入:

  1. userId = 1234
  2. userid = 12345
  3. timestamp = 88888888
  4. js = abc


grep只是提取你想要的行,而sed命令分别:

  • 从第一个引号开始。
  • 将名称和值之间的部分替换为“="。
  • 删除值结束引号之后的所有内容(包括该引号)。
展开查看全部
idfiyjo8

idfiyjo82#

这部分应该是对Pax的回答的评论,但是对于那个小盒子来说,它有点长。我想“单行数据”意味着你的变量中没有任何换行符?那么这将起作用:

  1. echo "$info" | sed -n -r '/<input/s/<input +name="([^"]+)" +value="([^"]+)"[^>]*>[^<]*/\1 = \2\n/gp'

字符串
有趣的地方:--n意味着默认情况下不打印-我们将在最后说明何时使用p打印。

  • -r表示扩展正则表达式
  • /<input/在开始时确保我们甚至不必费心处理不包含所需模式的行
  • 最后的\n是为了确保所有记录都在单独的行上结束-任何原始的换行符仍然会在那里,最快的摆脱它们的方法是添加一个“|你可以使用sed魔法,但是你在输入后30秒内无法理解它。

我可以想到在awk中实现这一点的方法,但这实际上是sed(或perl!)的工作。

uqdfh47h

uqdfh47h3#

要处理包含多行的变量,您需要将变量名放在双引号中:

  1. echo "$info"|sed 's/^\(<input\( \)name\(=\)"\([^"]*\)" value="\([^"]*\)"\)\?.*/\4\2\3\2\5/'

字符串

jum4pzuy

jum4pzuy4#

使用perl

  1. cat file | perl -ne 'print($1 . "=" . $2 . "\n") if(/name="(.*?)".*value="(.*?)"/);'

字符串

egdjgwm8

egdjgwm85#

在我看来,解析HTML应该用一个合适的HTML/XML解析器来完成。例如,Ruby有一个优秀的包Nokogiri,用于解析HTML/XML:

  1. ruby -e '
  2. require "rubygems"
  3. require "nokogiri"
  4. doc = Nokogiri::HTML.parse(ARGF.read)
  5. doc.search("//input").each do |node|
  6. atts = node.attributes
  7. puts "%s = %s" % [atts["name"], atts["value"]]
  8. end
  9. ' mess.html

字符串
产生你想要的输出

7fhtutme

7fhtutme6#

AWK:

  1. BEGIN {
  2. # Use record separator "<", instead of "\n".
  3. RS = "<"
  4. first = 1
  5. }
  6. # Skip the first record, as that begins before the first tag
  7. first {
  8. first = 0
  9. next
  10. }
  11. /^input[^>]*>/ { #/
  12. # make sure we don't match outside of the tag
  13. end = match($0,/>/)
  14. # locate the name attribute
  15. pos = match($0,/name="[^"]*"/)
  16. if (pos == 0 || pos > end) { next }
  17. name = substr($0,RSTART+6,RLENGTH-7)
  18. # locate the value attribute
  19. pos = match($0,/value="[^"]*"/)
  20. if (pos == 0 || pos > end) { next }
  21. value = substr($0,RSTART+7,RLENGTH-8)
  22. # print out the result
  23. print name " = " value
  24. }

字符串

展开查看全部
tp5buhyn

tp5buhyn7#

awk和sed等工具可以与XMLStarletHTML Tidy一起使用来解析HTML。

vc9ivgsu

vc9ivgsu8#

下面是一个简短的awk oneliner使用bash:

  1. awk 'BEGIN{ FS="\""; RS="<";}/\=/{print $2," = ", $4;}' <(printf "%s" ${info})

字符串
说明:
RS="<”--将文本分成记录(-行)
FS=""”--将记录分为字段,

  1. /\=/ -- choose lines containing =


{print $2,”=“,$4;} --打印第二个和第四个字段,用空格和=分隔

相关问题