在perlre
的扩展模式页面上,我们可以阅读\K
:
保留剩下的东西
\K
,不要包含在 $&
这是使用 GNU 的实际示例grep
(实际上保留了 GNU 的内容\K
):
$ echo "foo bar buzz" | grep -Po "foo \Kbar buzz"
bar buzz
有没有相反的顺序\K
?
例如仅打印bar
,例如:
$ echo "foo bar buzz" | grep -Po "foo \Kbar\X buzz"
bar
在perlre
的扩展模式页面上,我们可以阅读\K
:
保留剩下的东西
\K
,不要包含在 $&
这是使用 GNU 的实际示例grep
(实际上保留了 GNU 的内容\K
):
$ echo "foo bar buzz" | grep -Po "foo \Kbar buzz"
bar buzz
有没有相反的顺序\K
?
例如仅打印bar
,例如:
$ echo "foo bar buzz" | grep -Po "foo \Kbar\X buzz"
bar
我有以下内容file.log
:
2018.03.02 R:123-123 [Debug] Parameters AAA ...
2018.03.02 R:123-124 [Debug] Parameters BBB ...
2018.03.02 R:123-125 [Debug] Parameters CCC ...
2018.03.02 R:123-126 [Debug] Parameters DDD ...
2018.03.02 R:123-126 [Debug] Parameters EEE ...
2018.03.02 R:123-456 [Debug] Parameters XXX ...
2018.03.02 R:123-456 [Debug] Parameters YYY ...
2018.03.02 R:456-456 [Debug] Parameters ZZZ ...
2018.03.02 R:123-123 [Debug] Parameters XYZ ...
我主要对阅读$2
和$5
专栏感兴趣。
我想从第 5 列中找到与第 2 列中相同值不同的所有值。
这是我所拥有的:
$ awk '{print $5" "$2}' file.log | uniq -s3 -c | sort -nr | grep -vw 1
2 XXX R:123-456
2 DDD R:123-126
但我正在寻找使用更少管道的更有效方式,理想情况下使用Bash和Awk作为脚本或从命令行。
输出可以是相似的,也可以打印整行。上述输出的问题是,它没有显示给定第二列的所有出现。最后一行也没有考虑到(XYZ
)。
我还可以在Bash中编写以下内容:
$ grep -f <(awk '{print $5" "$2}' file.log | uniq -s3 -c | sort -nr | grep -vw 1 | awk '{print $3}') file.log
2018.03.02 R:123-126 [Debug] Parameters DDD ...
2018.03.02 R:123-126 [Debug] Parameters EEE ...
2018.03.02 R:123-456 [Debug] Parameters XXX ...
2018.03.02 R:123-456 [Debug] Parameters YYY ...
但是该命令不会打印带有 的行R:123-123
,其次它对于较大的文件效率不高。
有效的预期结果是:
R:123-123
,因为它们有两个不同的参数:AAA
, XYZ
.R:123-126
,因为它们有两个不同的参数:DDD
, EEE
.R:123-456
,因为它们有两个不同的参数:XXX
, YYY
.如何更有效地实现这一目标?
我有以下 shell 脚本:
#!/usr/bin/env bash
PARAMS=( arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 )
[ $# -lt ${#PARAMS[@]} ] && { echo "Usage: $0 ${PARAMS[@]}"; exit 1; }
DATA=$(printf "%s=%s&" ${PARAMS[@]} $@)
echo curl "http://example.com/api/?${DATA%?}"
它旨在获取n个参数并将它们与从参数中读取的值相关联。
所以当我运行时:
./curl_params.sh 1 2 3 4 5 6 7 8 9
我希望格式为:
curl http://example.com/api/?arg1=1&arg2=2&arg3=3&arg4=4&arg5=5&arg6=6&arg7=7&arg8=8&arg9=9
但相反,我有:
curl http://example.com/api/?arg1=arg2&arg3=arg4&arg5=arg6&arg7=arg8&arg9=1&2=3&4=5&6=7&8=9
我知道我需要与 结合${PARAMS[@]}
,$@
所以这些值被合并了。
是否有任何 Bash 语法可用于将参数名称转置/映射到相应的值?
为了澄清,参数的名称可能会改变。
我创建了以下端口转发:
ssh -vL localhost:4433:example.com:443 remote-linux-host
注意:我4433
在本地使用,而不是443
避免使用sudo
.
但是,当我转到 时https://localhost:4433/
,在忽略证书检查后,出现以下错误(在 Chrome 和 Firefox 上):
404 - 未找到
使用时相同curl
:
$ curl -s https://localhost:4433/ | html2text
<?xml version="1.0" encoding="iso-8859-1"?>
****** 404 - Not Found ******
如何为 HTTPS 进行端口转发?
https://example.com/
我的目标是通过远程服务器在我的本地(端口 4433)上打开(通过 HTTPS 可以正常工作)。