【问题标题】:Printing only part of next line after matching a pattern匹配模式后仅打印下一行的一部分
【发布时间】:2019-01-04 09:32:14
【问题描述】:

我想在比赛结束后打印下一句
我的文件内容是这样的:

SSID:CoreFragment
Passphrase:WiFi1234
SSID:CoreFragment_5G
Passphrase:WiFi1234
SSID:Aleph_inCar
Passphrase:1234567890

根据我的搜索,例如如果我找到了WIFI-3(SSID),我想打印1234ABCD。我使用此命令搜索 SSID:

grep -oP '^SSID:\K.+' file_name 

在此搜索之后,我想打印该特定匹配的密码。

我正在开发 Ubuntu 18.04

ssid=$(grep -oP '^SSID:\K.+' list_wifi.txt)
对于 $(sudo iwlist wlp2s0 scan | grep ESSID | cut -d '"' -f2) 中的 ssid
做
    如果 [ $ssid == $ssid_name ];然后
       echo "SSID 找到...";
    菲
完毕

我想在匹配后打印下一行。

【问题讨论】:

  • 由于您没有使用代码标签,所以您的样本没有被清除,请添加代码标签。
  • 这是代码示例: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 After echo "SSID found..."; 这个语句我想打印 Passphrase
  • 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..."; password=$(awk '/$ssid/{flag=1;next} flag{sub(/.*:/,"" );print $0;flag=""}' list_wifi.txt) echo " $password"; fi done 在这我得到了一个空行
  • @yashshah:你是怎么运行我的命令的?您正在错误地测试它。我的答案解决了您遇到的确切问题
  • 不......我完全按照你建议的命令做,但我想将该值存储在变量中......通常它可以工作,但是当我将它存储到值时它不起作用...... .

标签: awk sed grep


【解决方案1】:

另一个awk

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

1234ABCD 

只有在下一行时才会打印该值。

【讨论】:

  • 当我将此命令存储在变量中时,它不会打印任何内容
  • 我的 ssid 不是每次都固定,所以如何打印其他 ssid,我尝试使用 $ssid 但它不起作用
  • 这将在变量$ssid中搜索给定值。
  • 但这对我不起作用,我在输出中得到空行
【解决方案2】:
awk -F: '/WIFI-3/{getline;print $2; exit}' file

1234ABCD

【讨论】:

  • 我只想在 print 语句之后多加一个exit。以防他的密码文件有几 GB 大 ;-)
  • @kvantour 感谢您的提示。
  • 并且手指越过 getline 不会失败,否则你会悄悄地在输出中得到部分 WIFI-3 线并认为它成功了。请参阅awk.freeshell.org/AllAboutGetline 了解如何安全地调用 getline(但在这种情况下最好避免使用)。
  • 如果“WIFI-3”作为密码出现,这将打印下一个 SSID 值。
【解决方案3】:

稳健(不会因部分匹配等原因而失败)且惯用:

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

【讨论】:

  • 对于通用方式,它将如何帮助我?
  • 我的 ssid 可能会改变,但我尝试在此命令中使用 $ssid 时却不显示结果
  • 作为变量传入awk -v ssid="$ssid" '... ($1==ssid) ...'
【解决方案4】:

请尝试以下方法:

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

产生:

1234ABCD

【讨论】:

  • 我们可以把它存入变量吗?我必须在 shell 脚本中进一步使用它
  • 当然。我已经相应地修改了我的答案。
【解决方案5】:

由于代码标签改变了示例的外观,所以现在添加它。

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

【讨论】:

  • @yashshah,第一个也不起作用,它对我有用,检查一次?
  • 是的,它可能有效,但我想打印匹配的密码。 WIFI-3 只是一个例子,我需要更通用的方式
  • 我只想打印一个密码,但根据你的回答,我得到了所有
  • @yashshah,现在请检查第一个?
  • 它只在命令行中打印,但是当我存储在变量中时它不起作用......
【解决方案6】:

使用 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
$

【讨论】:

  • 我想要这个在 shell 脚本中
  • 是的..你也可以在shell脚本中调用perl..我发布的是一个单行..它会工作
  • 我刚刚用一个例子更新了答案..请检查
  • 它没有打印任何东西
  • 你必须export ssid="WIFI-3" 而不仅仅是ssid="WIFI-3"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-02
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
  • 1970-01-01
相关资源
最近更新 更多