Awk 匹配图案后仅打印下一行的一部分

Awk 匹配图案后仅打印下一行的一部分,awk,sed,grep,Awk,Sed,Grep,我想在比赛后打印下一句话 我的文件内容如下: SSID:CoreFragment Passphrase:WiFi1234 SSID:CoreFragment_5G Passphrase:WiFi1234 SSID:Aleph_inCar Passphrase:1234567890 根据我的搜索,例如,如果我发现WIFI-3(SSID)than,我想打印1234ABCD。我使用此命令搜索SSID: grep -oP '^SSID:\K.+' file_name 在此搜索之后,我想打印该特定匹

我想在比赛后打印下一句话
我的文件内容如下:

SSID:CoreFragment
Passphrase:WiFi1234
SSID:CoreFragment_5G
Passphrase:WiFi1234
SSID:Aleph_inCar
Passphrase:1234567890
根据我的搜索,例如,如果我发现
WIFI-3(SSID)
than,我想打印
1234ABCD
。我使用此命令搜索SSID:

grep -oP '^SSID:\K.+' file_name 
在此搜索之后,我想打印该特定匹配的密码短语

我正在开发Ubuntu 18.04

ssid=$(grep -oP '^SSID:\K.+' list_wifi.txt) for ssid in $(sudo iwlist wlp2s0 scan | grep ESSID | cut -d '"' -f2) do if [ $ssid == $ssid_name ]; then echo "SSID found..."; fi done ssid=$(grep-oP'^ssid:\K.+'list_wifi.txt) 对于ssid,单位为美元(sudo iwlist wlp2s0扫描| grep ESSID | cut-d'“'-f2) 做 如果[$ssid==$ssid_name];则 回显“找到SSID…”; fi 完成
我想在匹配后打印下一行。

因为代码标签改变了样本的外观,所以现在添加它

var=$(awk '/SSID:[a-zA-Z]+-[0-9]+/{flag=1;next} flag{sub(/.*:/,"");value=$0;flag=""} END{print value}' Input_file)
echo "$var"


你能试试下面的吗

awk '/Passphrase/ && match($0,/WIFI-3 Passphrase:[0-9a-zA-Z]+/){val=substr($0,RSTART,RLENGTH);sub(/.*:/,"",val);print val;val=""}'  Input_file

因为代码标签改变了样本的外观,所以现在添加它

var=$(awk '/SSID:[a-zA-Z]+-[0-9]+/{flag=1;next} flag{sub(/.*:/,"");value=$0;flag=""} END{print value}' Input_file)
echo "$var"


你能试试下面的吗

awk '/Passphrase/ && match($0,/WIFI-3 Passphrase:[0-9a-zA-Z]+/){val=substr($0,RSTART,RLENGTH);sub(/.*:/,"",val);print val;val=""}'  Input_file

请尝试以下操作:

ssid="WIFI-3"
passphrase=$(grep -A 1 "^SSID:$ssid" file_name | tail -n 1 | cut -d: -f2)
echo "$passphrase"
这将产生:

1234ABCD

请尝试以下操作:

ssid="WIFI-3"
passphrase=$(grep -A 1 "^SSID:$ssid" file_name | tail -n 1 | cut -d: -f2)
echo "$passphrase"
这将产生:

1234ABCD
使用Perl

$ export ssid="WIFI-3"
$ perl -0777 -lne ' /SSID:$ENV{ssid}\s*Passphrase:(\S+)/ and print $1 ' yash.txt
1234ABCD
$ export ssid="Aleph_inCar"
$ perl -0777 -lne ' /SSID:$ENV{ssid}\s*Passphrase:(\S+)/ and print $1 ' yash.txt
1234567890
$

$ cat yash.txt
SSID:CoreFragment
Passphrase:WiFi1234
SSID:CoreFragment_5G
Passphrase:WiFi1234
SSID:Aleph_inCar
Passphrase:1234567890
SSID:WIFI-1
Passphrase:1234ABCD
SSID:WIFI-2
Passphrase:123456789
SSID:WIFI-3
Passphrase:1234ABCD
您可以在变量中捕获它,如下所示

$ passphrase=$(perl -0777 -lne ' /SSID:$ENV{ssid}\s*Passphrase:(\S+)/ and print $1 ' yash.txt)
$ echo $passphrase
1234567890
$
使用Perl

$ export ssid="WIFI-3"
$ perl -0777 -lne ' /SSID:$ENV{ssid}\s*Passphrase:(\S+)/ and print $1 ' yash.txt
1234ABCD
$ export ssid="Aleph_inCar"
$ perl -0777 -lne ' /SSID:$ENV{ssid}\s*Passphrase:(\S+)/ and print $1 ' yash.txt
1234567890
$

$ cat yash.txt
SSID:CoreFragment
Passphrase:WiFi1234
SSID:CoreFragment_5G
Passphrase:WiFi1234
SSID:Aleph_inCar
Passphrase:1234567890
SSID:WIFI-1
Passphrase:1234ABCD
SSID:WIFI-2
Passphrase:123456789
SSID:WIFI-3
Passphrase:1234ABCD
您可以在变量中捕获它,如下所示

$ passphrase=$(perl -0777 -lne ' /SSID:$ENV{ssid}\s*Passphrase:(\S+)/ and print $1 ' yash.txt)
$ echo $passphrase
1234567890
$
稳健(不会因部分匹配等原因而失败)且惯用:

$ awk -F':' 'f{print $2; exit} ($1=="SSID") && ($2=="WIFI-3"){f=1}' file
1234ABCD
稳健(不会因部分匹配等原因而失败)且惯用:

$ awk -F':' 'f{print $2; exit} ($1=="SSID") && ($2=="WIFI-3"){f=1}' file
1234ABCD

另一个
awk

$ awk -F: -v s="$ssid" '$0=="SSID:"s{c=NR+1} c==NR{print $2; exit}' file

1234ABCD 

仅当值位于下一行时才会打印。

另一个
awk

$ awk -F: -v s="$ssid" '$0=="SSID:"s{c=NR+1} c==NR{print $2; exit}' file

1234ABCD 



仅当值位于下一行时,才会打印该值。

由于您没有使用代码标记,因此您的示例未被清除,请向其添加代码标记。这是中ssid的代码示例:ssid=$(grep-oP“^ssid:\K.+”list\u wifi.txt)$(sudo iwlist wlp2s0 scan | grep-ESSID | cut-d''-f2)do if[$ssid==$ssid_name];然后echo“ssid find…”;fi在echo“ssid find…”之后完成;此语句我想打印ssid的密码短语=$(grep-oP'^ssid:\K.+'list_wifi.txt)(sudo iwlp2s0 scan | grep-ESSID | cut-d'-d'-f2)do if[$ssid==$ssid_name];然后回显“ssid已找到…”;密码=$(awk'/$ssid/{flag=1;next}flag{sub(/.*:/,“”);打印$0;flag=“”}列表_wifi.txt)回显“$password”"我做完了这件事,我一片空白line@yashshah:您是如何运行我的命令的?您的测试不正确。我的回答完全解决了您没有的问题…我完全按照您建议的命令执行,但我想或者变量中的值…通常它可以工作,但当我将其存储到值中时它不工作…因为您没有使用代码标记,所以您的示例未被清除,请向它们添加代码标记。这是代码示例:ssid=$(grep-oP'^SSID:\K.+'list_wifi.txt)用于$中的SSID(sudo iwlist wlp2s0扫描| grep ESSID | cut-d'''''-f2)如果[$SSID==$SSID_name];则回显“找到SSID…”;回显“找到SSID…”后fi完成;此语句我想打印SSID$(grep-oP'^SSID:\K.+'list_wifi txt)用于SSID中的SSID$(sudo iwlist wlp2s0 scan | grep ESSID | cut-d''-f2)do if[$ssid==$ssid_name];然后回显“ssid found…”;password=$(awk'/$ssid/{flag=1;next}flag{sub sub(/.*:/,“”);print$0;flag=”“}list_wifi wifi.txt)回显“$password”我做完了这件事,我一片空白line@yashshah:您是如何运行我的命令的?您的测试不正确。我的回答完全解决了您没有的问题…我完全按照您建议的命令执行,但我想或者变量中的值…正常情况下有效,但当我将其存储到值中时无效…@yashshah,第一个不起作用,对我有效,检查一次?是的,可能有效,但我想打印匹配的密码短语。WIFI-3只是一个示例,我需要以更通用的方式打印它。我只想打印一个密码短语,但根据你的回答,我是g热刺all@yashshah,请现在检查第一个?它只在命令行中打印,但当我存储在变量中时它不起作用…@yashshah,第一个也不起作用,它对我起作用,检查一次?是的,它可能起作用,但我想打印匹配的密码。WIFI-3只是一个示例,我需要以更通用的方式打印它。我只想打印一个密码,但根据你的回答,我得到的是什么all@yashshah,请现在检查第一个?它只在命令行中打印,但当我存储在变量中时它不起作用…我们可以将其存储到变量中吗?我必须在shell scriptSure中进一步使用它。我已经相应地修改了我的答案。我们可以将其存储到变量中吗?我必须在shell scriptSure中进一步使用它。我已经修改了相应地验证了我的答案。我想在shell脚本中使用它。是的。你也可以在shell脚本中调用perl。我发布的是一行代码。它会工作的。我只是用一个例子更新了答案。请检查它没有打印任何内容。你必须
导出ssid=“WIFI-3”
而不仅仅
ssid=“WIFI-3”
我想在shell脚本中使用它是的..你也可以在shell脚本中调用perl..我发布的是一行代码..它会工作的我只是用一个例子更新了答案..请检查它没有打印任何东西你必须
导出ssid=“WIFI-3”
而不仅仅是
ssid=“WIFI-3”
我会在打印语句后加上一个
退出
。以防他的密码文件有几GB大;-)@kvantour谢谢你的提示。祈祷getline不会失败,否则你会在输出中悄悄地看到WIFI-3线路的一部分,并认为它成功了。请参阅如何安全地调用getline(但在本例中最好避免使用)。如果“WIFI-3”显示为密码短语,这将打印下一个SSID值。我只需在pr后添加一个额外的
退出