在awk中我可以写: awk -F: 'BEGIN {OFS = FS} ...'
在Perl中,相当于FS什么?我想写
perl -F: -lane 'BEGIN {$, = [what?]} ...'
Run Code Online (Sandbox Code Playgroud)
用一个例子更新:
echo a:b:c:d | awk -F: 'BEGIN {OFS = FS} {$2 = 42; print}'
echo a:b:c:d | perl -F: -ane 'BEGIN {$, = ":"} $F[1] = 42; print @F'
Run Code Online (Sandbox Code Playgroud)
两个输出 a:42:c:d
我宁愿不在:Perl BEGIN块中进行硬编码,也可以参考-F选项保存其参数的位置.
以下是文件的内容:
one two three
four five six
Run Code Online (Sandbox Code Playgroud)
这是我的别名
alias testawk "awk '{print $2}' file"
Run Code Online (Sandbox Code Playgroud)
这就是我得到的:
> testawk
one two three
four five six
Run Code Online (Sandbox Code Playgroud)
但是当我发出这个命令时,我得到了我想要的东西:
> awk '{print $2}' file
two
five
Run Code Online (Sandbox Code Playgroud)
如何转义别名中的字段说明符?注意:我正在使用csh
我总是在bash中使用vi模式.如果我处于命令模式或插入模式,那么直观地看是非常有用的.
例如,当我想要搜索历史记录时,/my_search在我按下之前键入任一模式看起来都是一样的Enter,到那时为时已晚.我发现自己压力Esc远远超过必要,只是为了确保我处于正确的模式......
与如何在 sh 的字符串中添加换行符是同样的问题 ? 但在鱼壳里。
在 bash 中我们有:
$'this is line\nthis is another line'
谁产生了预期的结果,但在鱼中这不起作用。
鱼有类似的方法吗?
编辑1:
faho 明智地提到了字面方法:
'this is line
this is another line'
\n但我真的很好奇是否存在像 shell 中那样保留换行符引用的方法。
我想知道是否可以使用这个字符串"this is a line\nthis is another line"来确保鱼将其视为\n换行符而不是文字。
如果字段分隔符是空字符串,则每个字符将成为单独的字段
$ echo hello | awk -F '' -v OFS=, '{$1 = NF OFS $1} 1'
5,h,e,l,l,o
Run Code Online (Sandbox Code Playgroud)
但是,如果FS是可能匹配零次的正则表达式,则不会发生相同的行为:
$ echo hello | awk -F ' *' -v OFS=, '{$1 = NF OFS $1} 1'
1,hello
Run Code Online (Sandbox Code Playgroud)
谁知道为什么会这样?我在gawk手册中找不到任何东西.是否FS=""只是一个特例?
我最感兴趣的是理解为什么第二种情况不会将记录分成更多的字段.就好像awk FS=" *"一样对待FS=" +"
我想从bash脚本中的句子中提取一个单词.它使用昏迷和空格作为分隔符.
ex:- date=crossed 122 name=foo , userid=234567 , sessionid=2233445axdfg5209 associd=2
Run Code Online (Sandbox Code Playgroud)
我有上面的句子,其中有趣的部分是name = foo.键名总是相同但字符串foo可能会有所不同.其他参数也可能存在,也可能不存在.
我需要提取上面的键值对.所以输出将是:
name=foo
Run Code Online (Sandbox Code Playgroud)
在shell脚本中执行此操作的最佳方法是什么?
谢谢!
不同的工具以不同的方式实现 例如,匹配"foo"或"bar":
printf "%s\n" foo bar baz food | grep -o '\<\(fo\+\|bar\)\>'
printf "%s\n" foo bar baz food | awk '/\<(fo+|bar)\>/'
printf "%s\n" foo bar baz food | sed -n '/\<\(fo\+\|bar\)\>/p'
printf "%s\n" foo bar baz food | sed -nr '/\<(fo+|bar)\>/p'
Run Code Online (Sandbox Code Playgroud)
这些差异记录在哪里?
我的脚本有第一条指令:
set -e
Run Code Online (Sandbox Code Playgroud)
因此,无论何时发生错误,脚本都会中止.我想捕获这种情况以显示信息消息,但我不想在脚本退出时显示该消息; 只有当设置-e触发堕胎时.有可能陷入这种情况吗?
这个:
set -e
function mytrap {
echo "Abnormal termination!"
}
trap mytrap EXIT
error
echo "Normal termination"
Run Code Online (Sandbox Code Playgroud)
在任何出口调用(无论是否发生错误),这不是我想要的.
我想过滤在 modekubectl下运行的命令的输出--watch,以密切关注某个 k8s 注释的更改。我正在使用以下命令:
kubectl get pod my-pod --watch -o json | jq '.metadata.annotations["my-annotation"]'
问题是 - 在我停止命令之前不会打印任何内容。我希望jq处理输入并在my-pod发生更改时打印它。
我尝试使用该--unbuffered标志,但没有解决问题。
我正在尝试在 Bash 中编写一个未找到的句柄,它执行以下操作:
cd进入它。$DEV_DIR,`cd 进入它。现在我有这样的事情:
export DEV_DIR=/Users/federico/programacion/
function command_not_found_handle () {
if [ -d $1 ]; then # the dir exists in '.'
cd $1
else
to=$DEV_DIR$1
if [ -d $to ]; then
cd $to
echo `pwd`
else
echo "${1}: command not found"
fi
fi
}
Run Code Online (Sandbox Code Playgroud)
尽管它似乎在工作(该echo pwd命令打印了预期的目录),但实际 shell 中的目录并没有改变。
我的印象是,因为这是我.bashrc的 shell 中的一个函数,所以我不会分叉,我可以这样做,cd但显然这不起作用。任何有关如何解决此问题的提示将不胜感激。